我有問題,我試圖以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