在基于套接字的应用程序(客户端/服务器)中,我想让服务器充当代理(管理器)来处理多个客户端,并从一个客户端获取消息并将其发送到客户端,由一个身份证件。
如何知道所需的客户端运行在不同的线程上,如何获取 id 代表的关联客户端的套接字?
最佳答案
只需将某种客户端 ID 的内存 HashMap 保留到表示该客户端套接字的 java.net.Socket 对象即可。您需要想出某种分配客户端 ID 的方法,可以是客户端提供的,也可以是服务器通过某种授权方案提供的。
当收到针对客户端 ID 的消息时,从映射中获取套接字并向其发送消息。该映射需要存储在单例类型的对象中,并且需要正确同步。使用并发 HashMap 。此外,如果要使用多线程,则套接字读取和写入需要同步。
我已经发布了一些示例代码作为 github gist 。这与我上面解释的有点不同。我不在 map 中存储套接字,而是存储具有套接字的客户端处理程序。此外,套接字读取不需要同步:每个客户端都有自己的线程,这是从套接字读取的唯一线程。不过,套接字写入确实需要同步,因为发送客户端的线程正在写入接收客户端的套接字。
您最好使用类似 JBoss Netty 的内容。而不是自己动手。
关于java - 如何设计多客户端/服务器应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224165/