1

サーバーに接続できるアプリを作成しました。すべてがスムーズに実行されていますが、サーバーがクライアントに同時にメッセージを送信すると問題が発生します。サーバーが2つのメッセージを続けて送信する場合など。クライアントは最初のものを受け取るだけです。複数のメッセージを連続して取得することは可能ですか?

これがクライアントのコードの私の部分です:

TcpClient clientSocket;
public string IPS= "###.###.###.###";
public int SocketS = ####;

public void ConnectingToServer()
{
    clientSocket= new TcpClient();
    clientSocket.Connect(IPS, SocketS);
    if (clientSocket.Connected)
    {
        serverStream = clientSocket.GetStream();
        byte[] outStream = System.Text.Encoding.ASCII.GetBytes();
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();
    }
}

// Function for send data to server.
public void SendDataToServer(string StrSend)
{
    if (clientSocket.Connected)
    {
        byte[] outStream = System.Text.Encoding.ASCII.GetBytes(StrSend);
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();
    }
}

// Function for receive data from server (I put this in looping).
public void getMessage()
{
    if (clientSocket != null)
    {
        if (clientSocket.Connected)
        {
            if (serverStream.DataAvailable)
            {
                int buffSize = 0;
                buffSize = clientSocket.ReceiveBufferSize;
                byte[] inStream = new byte[buffSize];
                serverStream.Read(inStream, 0, buffSize);
                string StrReceive= System.Text.Encoding.ASCII.GetString(inStream);
            }
        }
    }
}
4

1 に答える 1

1

ソケットの送受信機能は、ご提供いただいたすべてのデータが一度に送受信されることを保証するものではありません。関数は、実際の送受信バイト数を返します。あなたの場合、メソッド呼び出しの結果を無視してはなりません。serverStream.Read(...)

そのため、アプリケーションレベルのプロトコルは、物事を交換するように設計する必要があります(これを「メッセージ」と呼びます)。

プロトコルを設計するための多くのアプローチがありますが、例として次の「メッセージ」プロトコルを考えてみましょう。

----------------------------------------------------
| Number of string bytes | String bytes in UTF-8   |
----------------------------------------------------
| 1 byte                 | 2 - ... bytes           |
----------------------------------------------------

「メッセージ」の送信:文字列はUTF-8(たとえば)表現に変換され、(上記のように)バイト表現のバイト長で送信される必要があります。

メッセージの受信:データをメモリバッファに受信します。「メッセージ」を抽出するプロセスは、送信するプロセスとは逆です。もちろん、一度に複数の「メッセージ」を受信する可能性があるため、バッファを完全に処理してください。

コード例を使って小さな記事を書いたところです。

于 2013-02-06T09:31:34.630 に答える