java - 如何设计多客户端/服务器应用程序?

标签 java sockets client-server

在基于套接字的应用程序(客户端/服务器)中,我想让服务器充当代理(管理器)来处理多个客户端,并从一个客户端获取消息并将其发送到客户端,由一个身份证件。

如何知道所需的客户端运行在不同的线程上,如何获取 id 代表的关联客户端的套接字?

最佳答案

只需将某种客户端 ID 的内存 HashMap 保留到表示该客户端套接字的 java.net.Socket 对象即可。您需要想出某种分配客户端 ID 的方法,可以是客户端提供的,也可以是服务器通过某种授权方案提供的。

当收到针对客户端 ID 的消息时,从映射中获取套接字并向其发送消息。该映射需要存储在单例类型的对象中,并且需要正确同步。使用并发 HashMap 。此外,如果要使用多线程,则套接字读取和写入需要同步。

我已经发布了一些示例代码作为 github gist 。这与我上面解释的有点不同。我不在 map 中存储套接字,而是存储具有套接字的客户端处理程序。此外,套接字读取不需要同步:每个客户端都有自己的线程,这是从套接字读取的唯一线程。不过,套接字写入确实需要同步,因为发送客户端的线程正在写入接收客户端的套接字。

您最好使用类似 JBoss Netty 的内容。而不是自己动手。

关于java - 如何设计多客户端/服务器应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224165/

相关文章:

java - 确定 Java 中的等效数组

spring - 是否有任何 spring 集成 tcp-inbound-channel-adapter 示例?

linux - 如何绑定(bind)到只有一个网络接口(interface)(Linux)的所有地址?

java - 数字格式异常 :Invalid lng

java - 在java中限制应用程序的多个实例

使用 maven 和 tomcat 6 的 javamail

java - 从 log4j 切换到 logback

java - java套接字读取的数据是否与发送时完全相同

java - 如何构建分布式 Java 应用程序?

c - 通过 TCP-IPv6 连接进行数据传输