【问题标题】:Socket multiple client one server套接字多个客户端一台服务器
【发布时间】:2017-01-23 16:08:19
【问题描述】:

如何停止向客户端发送消息,而客户端不从服务器读取消息。为了更好地理解这意味着什么,请考虑客户端长时间不调用 Read 并且服务器停止向该客户端发送消息的场景。 Server.cs 接收来自客户端的消息,并发送给所有客户端

private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket current = (Socket)AR.AsyncState;
            int received;
            try
            {
                received = current.EndReceive(AR);
            }
            catch (SocketException)
            {
                Console.WriteLine("Client forcefully disconnected");
                current.Close();
                clientSockets.Remove(current);
                return;
            }
            byte[] recBuf = new byte[received];
            Array.Copy(buffer, recBuf, received);
            string text = Encoding.ASCII.GetString(recBuf);
            Console.WriteLine("Received Text: " + text);
            buffQueue.Enqueue(text);
            current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
            foreach (var client in clientSockets)
            {
                foreach (var msg in buffQueue)
                {
                    Sendata(client, text);
                }
                }
            }
       static void Sendata(Socket socket, string noidung)
        {
            byte[] data = Encoding.ASCII.GetBytes(noidung);
            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);

        }
        private static void SendCallback(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            socket.EndSend(AR);

        }

客户端.cs

public void ReceiveMessage(IAsyncResult ar)
        {
            Random rnd = new Random();
            Socket socket = (Socket)ar.AsyncState;
            int received = socket.EndReceive(ar);
            byte[] dataBuf = new byte[received];
            Array.Copy(receivedBuf, dataBuf, received);
            string msg = Encoding.ASCII.GetString(dataBuf);
            Console.WriteLine("> " + msg + '\n');
            ClientSocket.BeginReceive(receivedBuf, 0, receivedBuf.Length, SocketFlags.None,
                new AsyncCallback(ReceiveMessage), ClientSocket);
        }

【问题讨论】:

    标签: c# sockets server client tcpclient


    【解决方案1】:

    问题是,当客户端不读取缓冲区时,客户端的接收缓冲区将满,服务器将阻塞执行。您可以通过以下任一方式防止这种情况:

    • 为每个客户端排队数据。客户端必须请求数据,因此服务器将发送它的队列。 (在不同的线程上)
    • 在服务器上的套接字上使用socket.Blocking = false。当服务器正在发送数据并且缓冲区已满时,您将收到一个 WillBlock 异常,或者在发送时使用正确的重载,将返回一个 SocketErrorCode。 Windows Sockets: Blocking。你还需要排队。

    SendData 可以并行完成,因为字节缓冲区/数据在发送时不会改变。

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多