gpt4 book ai didi

c# - 尝试写入 Networkstream 时流不可写

转载 作者:行者123 更新时间:2023-11-30 17:47:30 25 4
gpt4 key购买 nike

我是套接字新手,正在尝试编写客户端-服务器应用程序我的应用程序有这两个主要方法:

服务器在单独的线程上运行:

    public void socketListener()
{
byte[] StreamMessage = new byte[9632];
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEndPoint =new IPEndPoint(IPAddress.Any , ControlLayer.GlobalParam.PEER2PEER_PORT);
listener.Bind(localEndPoint);
listener.Listen(10);

while (true)
{
Socket Handler = listener.Accept();
//int ByteRec = Handler.Receive(StreamMessage);

int MessageLength;
MessageLength = Handler.Receive(StreamMessage, 0, StreamMessage.Length, SocketFlags.None);
//return MessageLength;

// string message = System.Text.Encoding.Default.GetString(StreamMessage);
string message = System.Text.Encoding.UTF8.GetString(StreamMessage);

OnDataRecievedFromRemotePeer(this, message, "TcpServer");//send data to screen
Task.Run(() => { ParseMessage(message, Handler); });
}
}

一旦数据到达,我就让它收集数据并使用客户端发送客户:

    public void Write(string message)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(CreateClient), message);
}

private void CreateClient(object message)
{
try
{
peerClient = new TcpClient();
peerClient.Connect(remoteIP, 6001/*TODO remove this */);
netStream = peerClient.GetStream();//<- Exception
StreamWriter sw = new StreamWriter(netStream);
sw.Write((string)(message));
netStream.Close();
peerClient.Close();
}
catch(Exception ex)
{
//TODO :
}
}

每个站都是对称的,有这两种方式

我可以看出服务器正在工作并接受套接字和数据但是一旦我想回复,我就会在 CreateClient
中标记的行中得到异常stream 不可写,当查看 netStream 时,上面写着我有 ObjectDisposed Exception 。可能是什么原因造成的?

如果需要更多代码,请通知我

最佳答案

在客户端处理服务器响应之前,服务器关闭连接之间存在经典竞争。
TCP 是一种“礼貌”协议(protocol),这意味着您不能在服务器上执行即刻即弃的操作。连接需要在两端都处于事件状态,直到双方都处理完所有消息。因此,要么客户端需要发送确认/注销,以便服务器可以关闭连接,要么至少服务器必须等待 x 秒才能关闭它。

关于c# - 尝试写入 Networkstream 时流不可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24648624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com