在基于套接字的应用程序(客户端/服务器)中,我想让服务器作为代理(管理器)执行以处理多个客户端,并从一个客户端获取消息并将其发送到客户端,由一个ID。
如何知道在不同线程上运行所需的客户端,如何获取id所代表的关联客户端的套接字?
答案 0 :(得分:3)
只需将某种client-id的内存中的hashmap保存到表示该客户端套接字的java.net.Socket对象中。您需要提供一些方法来分配客户端ID,无论是客户端提供的还是通过某种授权方案提供的服务器。
当收到客户端ID的消息时,从地图中获取套接字并向其发送消息。此映射需要存储在单例类型的对象中,并且需要正确同步。使用并发哈希映射。此外,如果您要进行多线程,则需要同步套接字读取和写入。
我已将一些示例代码发布为github gist。它与我上面解释的有点不同。我没有在地图中存储套接字,我存储了具有套接字的客户端处理程序。此外,套接字读取不需要同步:每个客户端都有自己的线程,这是从套接字读取的唯一线程。套接字写入确实需要同步,因为发送客户端的线程正在写入接收客户端的套接字。
你可能最好使用JBoss Netty这样的东西,而不是自己动手。
答案 1 :(得分:1)
你可以保存很多关于ID的信息,所以每次连接你就像ip一样保存正在运行的线程,然后你就像使用hashmap一样将id链接到所有那些信息然后你可以很容易地得到它正在运行的线程并将信息发送到正确的客户端
答案 2 :(得分:0)
将要传递的消息保存到数据库中,并使您的线程检查数据库,以便定期将新消息传递给“他们的”客户端。
如果您不想要消息的专用数据库,请使用简单的ClientID->套接字映射构建平面文件,并将其用作“电话簿”类型的查找系统。根据您计划添加的客户端数量,每个线程都可以预先并正常地将此类文件重新加载到其内存中,以便更快地访问...