【问题标题】:stream was not writable when trying to write to Networkstream尝试写入 Networkstream 时流不可写
【发布时间】:2014-08-30 04:19:50
【问题描述】:

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

SERVER 在单独的线程上运行:

    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
中标记的行中遇到异常 流是不可写的,当查看 netStream 时,写到我有 ObjectDisposed Exception 。 这可能是什么原因?

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

【问题讨论】:

    标签: c# sockets streamwriter netstream


    【解决方案1】:

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

    【讨论】:

    • 抱歉这个愚蠢的问题,但是我在服务器的哪里关闭了连接?另外,您认为我的逻辑对于这类应用程序来说是好的做法吗?
    • 经典方式是在服务器上为每个客户端设置一个线程或任务。目前,您的客户端连接仅在 while 循环的一次迭代中存在。我通常这样使用: while (true) { TcpClient client = _tcpListener.AcceptTcpClient(); Log.Info("新客户端连接"); var clientThread = new Thread(HandleClientComm) {IsBackground = true}; clientThread.Start(client); }
    • 能否请您发布一个简短的代码,以便我可以“逐步”摆脱他的生活? :)
    • 您正在查看竞赛/多线程,因此您必须小心“逐步”。如果您想要逐步/最少的代码,请查看codeproject.com/Articles/1415/…
    • 非常感谢您的帮助,但您提供的示例看起来与我的代码非常相似,您能否详细说明您需要完成的操作以及可能的简短(甚至是伪)代码给我正确的方向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2011-02-25
    • 2018-07-04
    相关资源
    最近更新 更多