Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 套接字多客户端一服务器_C#_Sockets_Server_Client_Tcpclient - Fatal编程技术网

C# 套接字多客户端一服务器

C# 套接字多客户端一服务器,c#,sockets,server,client,tcpclient,C#,Sockets,Server,Client,Tcpclient,当客户端不从服务器读取消息时,如何停止向客户端发送消息。为了更好地理解这意味着什么,考虑一个场景,其中客户端在长时间内不调用Read,服务器停止向该客户端发送消息。 Server.cs从客户端接收消息,并发送到所有客户端 private static void ReceiveCallback(IAsyncResult AR) { Socket current = (Socket)AR.AsyncState; int received

当客户端不从服务器读取消息时,如何停止向客户端发送消息。为了更好地理解这意味着什么,考虑一个场景,其中客户端在长时间内不调用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);

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

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

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

SendData
可以并行执行,因为bytebuffer/data在发送时不会更改