我有问题,我试图以base64格式发送数据。来自客户端的发送很好。但如果即时通讯尝试在服务器上反编译base64,即时通讯仍然总是出现错误,无效的base64文字记录器。C#异步套接字:发送数据base64编码?
我在寻找一种方法来加密客户端到服务器的数据并在服务器上解密它,以实现安全传输。
我的代码显示了ATM这样的: 客户:
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(ipAddress, ipAddressPort, new AsyncCallback(testA), null);
protected static void testA (IAsyncResult ar) {
socket.EndConnect(ar);
string str = EncodeTo64("Hello world!");
socket.BeginSend(System.Text.Encoding.UTF8.GetBytes(str), 0, str.Length, SocketFlags.None, new AsyncCallback(testB), socket);
}
protected static void testB (IAsyncResult ar) {
socket.EndSend(ar);
socket.BeginReceive(bytes, 0, bytes.Length, SocketFlags.None, new AsyncCallback(testC), socket);
}
protected static void testC (IAsyncResult ar) {
socket.EndReceive(ar);
MessageBox.Show(System.Text.Encoding.UTF8.GetString(bytes));
}
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
static public string DecodeFrom64(string encodedData)
{
byte[] encodedDataAsBytes
= System.Convert.FromBase64String(encodedData);
string returnValue =
System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
return returnValue;
}
服务器:
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 4444);
serverSocket.Bind(ipEndPoint);
serverSocket.Listen(4);
serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
protected static byte[] byteData = new byte[1024];
private void OnAccept(IAsyncResult ar)
{
Socket clientSocket = serverSocket.EndAccept(ar);
//Start listening for more clients
serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
//Once the client connects then start receiving the commands from her
// Create the state object.
clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
new AsyncCallback(OnReceive), clientSocket);
}
private void OnReceive(IAsyncResult ar) {
Socket clientSocket = (Socket)ar.AsyncState;
clientSocket.EndReceive(ar);
MessageBox.Show(DecodeFrom64(System.Text.Encoding.UTF8.GetString(byteData)));
}
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
static public string DecodeFrom64(string encodedData)
{
byte[] encodedDataAsBytes
= System.Convert.FromBase64String(encodedData);
string returnValue =
System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
return returnValue;
}
public void OnSend(IAsyncResult ar) {
Socket client = (Socket)ar.AsyncState;
client.EndSend(ar);
}
只是想知道...为什么你要发送一个字符串作为字符串=> Ascii => base64 => UTF8?这是否与特别期望base-64的API交谈?如果没有,你应该**只使用UTF8(其余不需要)。这是否正在运行时,是否打算将“ASCII”替换为“加密”?如果是这样的话:那么没有理由使用base-64/UTF8步骤:只发送二进制文件 – 2012-07-28 07:21:01
您收到的字节是否与您发送的字节匹配?特别要注意的是这是**不能保证**;您不会一直接收您发送的相同数据块中的数据。您应该考虑一个“成帧”协议 - 最简单的方法是,在每封邮件中装入以下邮件中的字节数,以便接收方知道何时收到完整的邮件。 – 2012-07-28 07:24:30
@MarcGravell他正在使用TCP和TCP保证可靠的字节流。这意味着他确实按照发送数据的顺序接收数据。 – 2012-07-28 08:32:10