0

Windows ベースのチャット アプリケーションを開発しています。クライアントが最初に Command クラスを送信すると、サーバーはそれを処理し、別の Command クラスを送信してクライアントに確認応答します。

(プログラムの流れがわかるように、コード セグメントに番号を付けました)

サーバーが確認を送り返すまで、すべてがうまくいきます。クライアント (5.) でコードを実行して、逆シリアル化して確認応答のコピーを取得すると、クライアント プログラムが応答しなくなります。しかし、サーバーのコード (6.) は機能しているようです。コマンドを正常にシリアル化します。

誰かがここで何が悪いのか指摘できますか?

前もって感謝します。

サーバーコード:

//1. Server runs first
try
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    //2. Server is blocked here waiting for an incoming stream
    Command newCommand = (Command)binaryFormatter.Deserialize(networkStream);
}
catch (Exception ex)
{
    MessageBox.Show("EXCEPTION: " + ex.Message);
    Console.WriteLine(ex.Message);
}

Client c = new Client(newCommand.ClientName, endPoint,
                                        clientServiceThread, client);

// ...processing the newCommand object

Command command = new Command(CommandType.LIST);

try
{
    TcpClient newTcpClient = new TcpClient(newClient.Sock.RemoteEndPoint
                                                           as IPEndPoint);
    newTcpClient.Connect(newClient.Sock.RemoteEndPoint as IPEndPoint);
    NetworkStream newNetworkStream = newTcpClient.GetStream();
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    //6. Server serializes an instance of the Command class to be recieved by the client
    binaryFormatter.Serialize(newNetworkStream, command);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Error");
    Console.WriteLine(ex.Message);
    newClient.Sock.Close();
    newClient.CLThread.Abort();
}

クライアントコード:

//3. Client runs second
TcpClient tcpClient = new TcpClient('localhost', 7777);
NetworkStream networkStream = tcpClient.GetStream();

Command newCommand = new Command(CommandType.CONN);

try
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    //4. Client serializes an instance of a Command class to the NetworkStream
    binaryFormatter.Serialize(networkStream, newCommand);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}


BinaryFormatter binaryFormatter = new BinaryFormatter();

//5. Then client is blocked until recieve an instance of command class to deserialize
Command serverResponse = (Command)binaryFormatter.Deserialize(networkStream);

clientForm.updateChatMessages(serverResponse);

//7. Instead of recieving the instance of the Command class, the clients go unresponsive
//   and the client program hangs.
4

1 に答える 1

0

私はそれを考え出した。サーバーが複数のクライアントにサービスを提供していたため、同じNetworkStreamインスタンスから逆シリアル化するのを間違えました。NetworkStreamそこで、サーバーにメッセージを送信させるたびにクライアントのソケットを提供することで、新しいコードを作成するようにコードを変更しました。

于 2012-09-25T06:09:51.013 に答える