0

複数人用の基本的なチャットシステムを作ろうとしています。メッセージとすべてを送信しますが、各クライアントから送信された最初のメッセージを除いて、各メッセージの最初のバイトが欠落しています (クライアントが送信しなかったか、サーバーが受信しなかったかに関係なく)。これが私のクライアントの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" を認識 - 最初の文字が欠落しています。

私は何が欠けていますか?私は何を間違えましたか?

4

0 に答える 0