我正在嘗試創建一個相當簡單的客戶端服務器應用程序,但對於通信我想使用二進制序列化對象。通信本身似乎相當好,但是當我在客戶端關閉流時,服務器並沒有真正注意到它,並一直試圖讀取流。從關閉的NetworkStream中讀取不會導致任何異常
服務器側(類服務器,在單獨的線程中執行):
偵聽連接
listener = new TcpListener(IPAddress.Parse("127.0.0.1"), this.Port);
listener.Start();
while (!interrupted)
{
Console.WriteLine("Waiting for client");
TcpClient client = listener.AcceptTcpClient();
AddClient(client);
Console.WriteLine("Client connected");
}
添加客戶機:
public void AddClient(TcpClient socket)
{
Client client = new Client(this, socket);
this.clients.Add(client);
client.Start();
}
監聽消息(深Client類裏面) :
BinaryFormatter deserializer = new BinaryFormatter();
while (!interrupted)
{
System.Diagnostics.Debug.WriteLine("Waiting for the message...");
AbstractMessage msg = (AbstractMessage)deserializer.Deserialize(stream);
System.Diagnostics.Debug.WriteLine("Message arrived: " + msg.GetType());
raiseEvent(msg);
}
單元測試:
Server server = new Server(6666);
server.Start();
Thread.Sleep(500);
TcpClient client = new TcpClient("127.0.0.1", 6666);
var message = new IntroductionMessage();
byte[] arr = message.Serialize();
client.GetStream().Write(arr, 0, arr.Length);
Thread.Sleep(500);
Assert.AreEqual(1, server.Clients.Count);
client.GetStream().Close();
client.Close();
Thread.Sleep(1000);
Assert.AreEqual(0, server.Clients.Count);
server.Stop();
因此,該消息得到正確讀取,但後來,當我關閉流,deserializer.Deserialize(流)似乎並沒有拋出任何異常......所以它應該只是不以這種方式閱讀,還是應該以不同的方式關閉客戶?
哪裏的服務器從獲取流?服務器對象內的TcpListener實例? – elgonzo
現在,我更新了問題 –