2011-08-28 38 views
2

在基于套接字的应用程序(客户端/服务器)中,我想让服务器作为代理(管理器)来处理多个客户端,并从一个客户端获取消息并将其发送给客户端, ID。如何设计一个多客户端/服务器应用程序?

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

+0

向谁投票结束这个问题,为什么你这样做?如果您有任何问题,请在这里留言!!!!!! – Adham

回答

0

保存要发送到数据库中的消息,并让您的线程检查数据库中是否有新消息定期发送给“他们”的客户端。

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

+0

如何知道目标套接字? – Adham

+0

你并不需要。 “发件人”线程使用已知客户端的ID写入数据库,“客户端”线程(独立工作)仅检查客户端的新消息。把它想象成一种死气沉沉的东西 - 一种只是放入东西,另一种只是放出东西...... – ty812

+0

如果我不想使用数据库?我想让它更实时的沟通。可能吗 ? – Adham

1

您可以保留大量关于ID的信息,因此每次连接你得到像ip一样的文件,然后保存它正在运行的线程,然后使用hashmap将id链接到所有的信息,然后你就可以很容易地获得它正在运行的线程并将信息发送到正确的客户端

3

只需将表示该客户端套接字的java.net.Socket对象的某种客户端ID的内存散列表保留。您需要想出一些分配客户端ID的方法,无论是客户端提供的,还是通过某种授权方案提供的服务器。

当消息进入客户端ID时,从地图中获取套接字并发送消息。这张地图需要存储在一个单例类型的对象中,并且需要正确同步。使用并发哈希映射。另外,如果你要进行多线程,套接字读写操作需要同步。

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

你可能更喜欢使用类似JBoss Netty的东西,而不是滚动自己的。

+0

我不明白这一点:“另外,如果要进行多线程,套接字读写操作将需要同步。 .. B.S.我需要自己制作一个,因为我想清楚地理解操作,因为我想实现使用Android Java的人。 – Adham

+0

套接字写入需要同步。如果两个消息进入同一客户端会怎么样?根据您设置服务器的方式,您可能会同时向客户端发送两条消息。这可能会破坏发送给客户端的数据。这是一个有趣的问题;我将编写一个小例子并稍微发布一下。 –

+0

真的我明白:) – Adham

相关问题