当前位置: 首页 > 编程语言 > C#

如何在不关闭C#中的NetworkStream的情况下发出数据结束信号分享

时间:2023-04-10 14:50:05 C#

C#学习教程:如何在不关闭C#中的NetworkStream的情况下发出数据结束信号服务器应该反序列化对象,对其进行更改,然后将其序列化并发回。服务器代码:TcpClientclient=server.AcceptTcpClient();using(NetworkStreamstream=client.GetStream()){using(StreamReaderstreamReader=newStreamReader(stream)){stringxmlData=streamReader.ReadToEnd();}}除非客户端关闭流,否则ReadToEnd不会返回。但是如果客户端关闭流,我就无法发送响应。有没有更好的办法?您可以通过仅关闭双工TCP连接的一半来发出“数据结束”信号。这是通过Socket.Disconnect实现的。看看这个例子是如何工作的,我和你的例子一致。客户端发送数据,然后调用Disconnect;这允许ReadToEnd返回,同时仍然保持一半的服务器连接打开。服务器然后发送响应并断开连接,之后双方可以关闭他们的连接以将其断开。staticvoidMain(string[]args){ActionclientCode=()=>{varbuffer=newbyte[100];varclientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);clientSocket.Connect(IPAddress.Loopback,6690);clientSocket.Send(缓冲区);clientSocket.Disconnect(false);Console.WriteLine("客户端:消息已发送,套接字已断开连接。");while(true){varbytesRead=clientSocket.Receive(buffer);如果(bytesRead==0){中断;}Console.WriteLine("客户端:读取"+bytesRead+"bytes.");}clientSocket.Dispose();};varserver=newTcpListener(IPAddress.Loopback,6690);varthread=newThread(newThreadStart(clientCode));服务器.启动();线程。开始();varclient=server.AcceptTcpClient();using(NetworkStreamstream=client.GetStream()){using(StreamReaderstreamReader=newStreamReader(stream)){vardata=streamReader.ReadToEnd();Console.WriteLine("服务器:读取"+data.Length+"字节。");//因为我们在这里知道客户端已断开连接。//在处理StreamReader之前发送响应,因为//这也会导致套接字本身关闭!Thread.Sleep(TimeSpan.FromSeconds(1));Console.WriteLine("服务器:发送响应。");stream.Write(新字节[10],0,10);Console.WriteLine("服务器:关闭套接字。");}}server.Stop();Console.WriteLine("服务器:等待客户端线程完成。");线程.加入();返回;您可以使用更高级别的框架,如WCF,或者如果您一心想管理自己的流,则不要使用ReadToEnd()-使用ReadLine()(并让客户端将消息作为一行发送),或者使用Read()并有一个特殊字符(哨兵)来表示消息结束发出数据结束信号以共享下面的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: