C# 如何使用服务器同时处理多个请求

C# 如何使用服务器同时处理多个请求,c#,loops,tcp,client-server,C#,Loops,Tcp,Client Server,好吧,我的想法是: 如果同时向一台服务器发出两个请求,其中一个会被拒绝吗?如果是,您如何防止这种情况发生 目前,我为正在制作的聊天应用程序设置了一个服务器,它基本上会启动TCP/IP连接,等待客户端,读取从客户端发送的数据,发送回一些内容,断开连接,然后重复。这样,服务器永远不会停止运行,并且可以发出您想要的任何请求 但是,如果一个客户端正在启动,而另一个程序正在使用服务器,该怎么办。如果一个程序在另一个程序启动时从服务器获取文件,而启动的程序需要从服务器获取数据,但它已经很忙,会发生什么 启动

好吧,我的想法是:

如果同时向一台服务器发出两个请求,其中一个会被拒绝吗?如果是,您如何防止这种情况发生

目前,我为正在制作的聊天应用程序设置了一个服务器,它基本上会启动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
确定一次待办事项列表中可以有多少个待处理的连接

如果积压工作完全填满了怎么办?此时,您需要第二台服务器和负载平衡器作为中间人,将一半的请求定向到第一台服务器,一半的请求定向到第二台服务器。

这里的逻辑很简单

  • 服务器开始侦听并开始接受客户端

  • 客户端尝试连接到服务器。若服务器并没有运行,或者您可以实现一些重新连接逻辑来通知客户端连接尝试失败,那个么您可以什么也不做

  • 让我们假设当客户端尝试连接时服务器正在运行。您正在谈论的是多客户端应用程序。你不应该断开客户端的连接。您应该将已连接的客户端添加到已连接客户端列表中

  • 然后,当一些客户端连接到服务器,而其他一些客户端已经连接并发送一些消息时。您通过客户端套接字接收该消息,然后将该消息广播给所有其他连接的客户端(发送数据的客户端除外)