我想建立一个TCP/IP服务器,最多可供100个并发客户端使用,但还不确定如何入手。
至少需要满足以下要求:
- 监听客户端,并将它们存储在数组或列表中。
- 对于每个客户端,它需要根据其客户端状态接收和发送数据。
- 当有人连接或断开连接时,服务器应更新客户端列表。
- 最好作为服务来运行,并带有GUI以进行管理。
有没有人能帮忙入手,我看了indy示例但它们没有帮助,也找了大多数组件但仍在搜索。
我想建立一个TCP/IP服务器,最多可供100个并发客户端使用,但还不确定如何入手。
至少需要满足以下要求:
有没有人能帮忙入手,我看了indy示例但它们没有帮助,也找了大多数组件但仍在搜索。
TidTCPServer
。您无需管理线程,一切都是透明的,因此您编写单个客户端应用程序的方式(几乎)与编写多个客户端的方式相同。请参见OnConnect
事件。其中有一个TidContext
参数,其中包含一个TThreadList。您可以使用该事件将客户端“注册”/添加到自定义数组/列表中,并使用OnDisconnect
删除客户端。OnExecute
事件。使用其参数读取发送的消息。TidTCPClient
。在此应用程序中,您将设置服务器的地址(请参阅Host属性)以及应与服务器的端口匹配的端口。在服务器运行时,应调用Connect
并使用SendCmd
方法发送字符串。(如果需要,还可以查看IOHandler.WriteLn
)Execute
事件有一个参数 AContext:TidContext
。因此,您可以使用 AContext.Connection
,其中有足够的方法向客户端发送数据,例如 AContext.Connection.SendCmd
。此外,您还可以使用 AContext.Connection.Socket
属性(如我所记得的那样),其中包含其(子)属性之一是发送消息的客户端的 IP 地址。如果您想记录日志等,可以将其用作“clientID”。 - John ThomasOnConnect是TIdServerThreadEvents的事件处理程序。当TIdPeerThread尝试连接到TIdTCPServer时,会发生OnConnect事件。
OnConnect接收一个名为AThread的参数,表示请求连接的TIdPeerThread线程。
将TIdServerThreadEvent事件处理程序分配给OnConnect。 [/indy文档]
对于每个客户端,需要根据其客户端状态接收和发送数据: --> 请查看聊天客户端和服务器演示源代码以获取详细示例。
最好作为带有GUI的服务进行管理:您可以开发一个服务应用程序,将其所有活动记录在DB中,并开发第二个应用程序,该应用程序将访问该DB并显示所有可用统计信息(客户端数量...)。
100个套接字并不算多。你可以费尽心思地使用像epoll()这样的东西,但对于这种情况,我只会设置一个包含所有套接字的FD_SET,选择整个集合,然后逐个检查每个套接字,并按顺序处理它们。如果我必须执行一些可能耗时的操作,我会为消息处理程序使用线程池。
我最近遇到了这个问题。这里有一个使用EPOLL管理数百个多播套接字的C++示例链接。你的将是TCP/IP,但那只是一个简单的更改。
无论你选择哪种方法,对于100+个同时套接字/客户端,你都需要使用一个基于poll、select或者如果你的平台支持的话,最好是epoll的线程模型。
http://anthonyvirtuoso.com/public/dokuwiki/doku.php/projects:multiplexreceiverepoll
@jfawcett - 在选择超过50个FD时,根据您实际执行选择的频率,会带来相当大的CPU负担。在我上面的评论中,示例类最初使用了select,但在看到CPU成本(valgrind w/callgrind)后,我切换到了epoll。但是,select肯定是一个有效的选项。
一些非常优秀的组件集,适用于像你这样的情况(以及更多),包括 kbmMW 和 RemObjects。还有其他一些不错的组件集,你可以在 Embarcadero 的 Delphi 第三方工具新闻组中搜索存档或提问。你可以在这里搜索存档:http://codenewsfast.com/