试图写入网络流时,流不可写

本文关键字:网络 | 更新日期: 2023-09-27 18:12:17

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

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

    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); });
            }
    }

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

    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
中标记的行中会出现异常流是不可写的,当查看netStream时,它被写为我有objectdispose异常。那是什么原因呢?

如果需要更多的代码也请告诉我

试图写入网络流时,流不可写

在客户端处理服务器的响应之前,服务器之间有一个经典的竞争,关闭连接。
TCP是一种"礼貌的"协议,这意味着您不能在服务器上执行"即发即弃"的操作。在两端都处理完所有消息之前,连接需要在两端都是活动的。因此,客户端需要发送确认/注销,以便服务器可以关闭连接,或者至少服务器必须等待x秒才能关闭连接。