【问题标题】:How to design a multi-client/server application?如何设计多客户端/服务器应用程序?
【发布时间】:2011-08-29 08:17:31
【问题描述】:

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

如何知道需要运行在不同线程上的客户端,如何获取该id代表的关联客户端的socket?

【问题讨论】:

  • 投票给谁来结束这个问题,你为什么这样做?!!!如果你有任何问题,请在这里评论!!!!!!

标签: java sockets client-server


【解决方案1】:

只需在表示该客户端套接字的 java.net.Socket 对象中保留某种客户端 ID 的内存哈希映射。您需要想出某种方法来分配客户端 ID,无论是客户端提供的,还是通过某种授权方案由服务器提供的。

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

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

你可能最好使用JBoss Netty 之类的东西,而不是自己滚动。

【讨论】:

  • 我不明白“此外,如果您要使用多线程,则套接字读取和写入需要同步。” .. 学士学位我需要自己制作一个,因为我想清楚地了解操作,因为我想使用 Android Java 实现某人。
  • 套接字写入需要同步。如果同一客户端收到两条消息怎么办?根据您设置服务器的方式,您可能会同时向客户端发送两条消息。这可能会损坏发送到客户端的数据。这是一个有趣的问题;我将编写一个小示例并稍后发布。
  • Blurgh 我在以良好格式发布代码时遇到问题。这是要点的链接:gist.github.com/1177411
  • 好的,这样代码就很简单了。只需启动服务器并启动多个 telnet 到 localhost 8081。您输入的第一行是客户端 ID。您发送的任何其他行均采用“toclientid: message”格式。
【解决方案2】:

您可以保留大量有关 ID 的信息,因此每次连接时,您都会获得类似 ip 的信息并保存它正在运行的线程,然后您可以像使用哈希图一样将 ID 链接到所有信息,然后您就可以轻松获得它正在运行的线程并将信息发送到正确的客户端

【讨论】:

    【解决方案3】:

    将要传递的消息保存到数据库中,并让您的线程定期检查数据库中要传递给“他们的”客户端的新消息。

    如果您不想要消息的专用数据库,请使用简单的 ClientID->Socket 映射构建一个平面文件,并将其用作“电话簿”类型的查找系统。根据您计划添加的客户端数量,每个线程可以预先并定期将此类文件重新加载到其内存中,以便更快地访问...

    【讨论】:

    • 我如何知道目标套接字?!
    • 你真的不需要。 “发送者”线程使用客户端已知的 ID 写入数据库,“客户端”线程(独立工作)仅检查其客户端的新消息。把它想象成一种死滴——一个只是把东西放进去,另一个只是把东西拿出来......
    • 如果我不想使用数据库?我想让它更实时的交流。有可能吗?
    • 然后跳过数据库,只做一个快速的基于文件的查找表,其中包含客户端 ID 和适当的套接字。把它想象成一种“电话簿”。
    • 太好了,所以我可以将客户端 ID 与什么相关联?如何存放插座?您的意思是我需要存储 IP 和端口,然后服务器(代理/管理器)将充当客户端,接收客户端充当服务器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多