如何与服务器同时处理多个请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何与服务器同时处理多个请求相关的知识,希望对你有一定的参考价值。
好吧,所以这是我的想法:
如果同时向一个服务器发出两个请求,是否会被拒绝,如果是,那么你怎么能保留这样的东西呢?
我目前为我正在制作的聊天应用程序设置了服务器,它基本上启动了TCP / IP连接,等待客户端,读取从它们发送的数据,发回一些东西,断开连接和重复。这样,服务器永远不会停止运行,并且可以生成任意数量的请求。
但是,如果客户端在另一个程序正在使用服务器时启动,该怎么办?如果一个程序从服务器获取文件而另一个程序正在启动,并且启动时需要来自服务器的数据,但它已经很忙,会发生什么?
启动会等到服务器可用,还是直接发生错误(因为没有可用的连接)。如果是这样,这可能非常糟糕,因为用户不会拥有所有数据,例如他的朋友列表,或者几个聊天。你怎么能解决这个问题?
我的想法是你可以设置一个while
循环,以便它一直排队服务器,直到它得到响应。这是正确的方法吗?
不,客户端应该假设服务器始终可用。您将看到基本的Socket.Listen(int32)
方法(TcpListener
充当包装器)采用一个参数backlog
:
Listen会导致面向连接的Socket侦听传入的连接尝试。 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
参数确定可以在积压一下子。
如果积压完全填满怎么办?此时,您需要第二台服务器和负载均衡器作为中间人,将一半请求指向第一台服务器,将一半请求指向第二台服务器。
这里的逻辑很简单。
- 服务器开始侦听并开始接受客户端。
- 客户端尝试连接到服务器。如果服务器没有运行,您可以简单地执行任何操作,或者您可以实现一些重新连接逻辑,通知客户端连接尝试失败。
- 让我们假设客户端尝试连接时服务器正在运行。您正在谈论多客户端应用程序。您不应该断开客户端。您应该将连接的客户端添加到已连接的客户端列表中。
- 然后,当某些客户端连接到服务器并且还有一些其他已连接的客户端并发送一些消息时。您通过客户端套接字接收该消息,然后将消息广播到除发送数据的所有其他连接的客户端。
以上是关于如何与服务器同时处理多个请求的主要内容,如果未能解决你的问题,请参考以下文章
Web 服务器如何在单个端口 (80) 上一次处理多个用户的传入请求?