C# 套接字多客户端一服务器
当客户端不从服务器读取消息时,如何停止向客户端发送消息。为了更好地理解这意味着什么,考虑一个场景,其中客户端在长时间内不调用Read,服务器停止向该客户端发送消息。 Server.cs从客户端接收消息,并发送到所有客户端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
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将满,服务器将阻塞执行。您可以通过以下两种方式来防止这种情况:
- 将每个客户端的数据排队。客户机必须请求数据,因此服务器将发送其队列。(在不同的线程上)
- 在服务器上的套接字上使用
。当服务器发送数据且缓冲区已满时,将出现WouldBlock异常,或者在发送时使用正确的重载时,将返回SocketErrorCode。你还需要排队socket.Blocking=false
SendData
可以并行执行,因为bytebuffer/data在发送时不会更改