複数人用の基本的なチャットシステムを作ろうとしています。メッセージとすべてを送信しますが、各クライアントから送信された最初のメッセージを除いて、各メッセージの最初のバイトが欠落しています (クライアントが送信しなかったか、サーバーが受信しなかったかに関係なく)。これが私のクライアントのSendとSendCallbackです:
private static void Send(Socket client, string data)
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
client.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);
}
private static void SendCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket) ar.AsyncState;
int bytesSent = client.EndSend(ar);
sendDone.Set();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
そして、これが私のサーバーの Accepter と ReceiveCallback です。
private static void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listenerSocket = (Socket) ar.AsyncState;
Socket handlerSocket = listenerSocket.EndAccept(ar);
if (!clientList.Contains(handlerSocket))
{
clientList.Add(handlerSocket);
}
// Creating the state object
StateObject state = new StateObject();
state.workSocket = handlerSocket;
handlerSocket.BeginReceive(state.buffer, 0, StateObject.BUFFER_SIZE, 0,
new AsyncCallback(ReceiveCallback), state);
}
private static void ReceiveCallback(IAsyncResult ar)
{
StateObject state = (StateObject) ar.AsyncState;
Socket handlerSocket = state.workSocket;
// Read data from the client socket.
try
{
int read = handlerSocket.EndReceive(ar);
if (read > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, read));
handlerSocket.BeginReceive(state.buffer, 0, StateObject.BUFFER_SIZE, 0, new AsyncCallback(ReceiveCallback),
state);
}
if (state.sb.Length > 0)
{
string content = state.sb.ToString();
foreach (Socket clientSocket in clientList)
{
Send(clientSocket, content);
}
Console.WriteLine(content);
state.sb = new StringBuilder();
}
else
handlerSocket.Close();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
問題の例を示します。
クライアントは「こんにちは」を送信し、
サーバーは「こんにちは」を認識します。すべて問題ありません。
次に:
クライアントが "hi" を送信 サーバーが "i" を認識 - 最初の文字が欠落しています。
私は何が欠けていますか?私は何を間違えましたか?