C# 如何使用服务器同时处理多个请求
好吧,我的想法是: 如果同时向一台服务器发出两个请求,其中一个会被拒绝吗?如果是,您如何防止这种情况发生 目前,我为正在制作的聊天应用程序设置了一个服务器,它基本上会启动TCP/IP连接,等待客户端,读取从客户端发送的数据,发送回一些内容,断开连接,然后重复。这样,服务器永远不会停止运行,并且可以发出您想要的任何请求 但是,如果一个客户端正在启动,而另一个程序正在使用服务器,该怎么办。如果一个程序在另一个程序启动时从服务器获取文件,而启动的程序需要从服务器获取数据,但它已经很忙,会发生什么 启动会一直等到服务器可用,还是直接出错(因为没有可用的连接)。如果是这样的话,这可能真的很糟糕,因为这样用户就不会拥有所有的数据,比如他的朋友列表,或者一些聊天记录。你怎么能解决这个问题C# 如何使用服务器同时处理多个请求,c#,loops,tcp,client-server,C#,Loops,Tcp,Client Server,好吧,我的想法是: 如果同时向一台服务器发出两个请求,其中一个会被拒绝吗?如果是,您如何防止这种情况发生 目前,我为正在制作的聊天应用程序设置了一个服务器,它基本上会启动TCP/IP连接,等待客户端,读取从客户端发送的数据,发送回一些内容,断开连接,然后重复。这样,服务器永远不会停止运行,并且可以发出您想要的任何请求 但是,如果一个客户端正在启动,而另一个程序正在使用服务器,该怎么办。如果一个程序在另一个程序启动时从服务器获取文件,而启动的程序需要从服务器获取数据,但它已经很忙,会发生什么 启动
我的想法是,您可以设置一个
while
循环,以便它在收到响应之前一直对服务器排队。这是正确的方法吗?不,客户端应该假设服务器始终可用。您将看到基本的Socket.Listen(int32)
方法(其TcpListener
充当的包装器)使用一个参数backlog
:
侦听使面向连接的套接字侦听传入的连接尝试。backlog参数指定可以排队接受的传入连接数。要确定可以指定的最大连接数,请检索MaxConnections值。听不住
大多数服务器实现从以下内容开始:
socket.Listen(10); // You choose the number
while (true)
{
var client = socket.Accept();
// Spawn a thread (or Task if you prefer), and have that do all the work for the client
var thread = new Thread(() => DoStuff(client));
thread.Start();
}
在这个实现中,总是有一个线程监听新的连接。当客户端连接时,会为其创建一个新线程,因此该客户端的处理不会延迟/阻止主线程上接受更多连接
现在,如果一些新连接的速度比服务器创建新线程的速度快,那么新连接将自动放入待办事项列表中(我认为是在操作系统级别)-参数backlog
确定一次待办事项列表中可以有多少个待处理的连接
如果积压工作完全填满了怎么办?此时,您需要第二台服务器和负载平衡器作为中间人,将一半的请求定向到第一台服务器,一半的请求定向到第二台服务器。这里的逻辑很简单