【发布时间】:2013-12-11 17:14:08
【问题描述】:
我正在尝试创建一个相当简单的客户端-服务器应用程序,但对于通信,我想使用二进制序列化对象。通信本身似乎很好,但是当我在客户端关闭流时,服务器并没有真正注意到它并继续尝试读取流。
服务器端(Server 类,在单独的线程中执行):
监听连接
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();
}
监听消息(在客户端类的深处):
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(stream) 似乎没有抛出任何异常......所以不应该以这种方式阅读,还是应该关闭客户以不同的方式?
【问题讨论】:
-
服务器从哪里获取流? Server 对象内的 TcpListener 实例?
-
现在,我更新了问题
标签: c#