我将在java中实现客户端 - 服务器应用程序。客户端和服务器通过TCP相互通信。只有一个中央服务器处理所有客户端消息。设计模式:客户端 - 服务器
我不使用RMI的通信,它们使用TCP的套接字进行通信,并且客户端可以通过服务器的另一个客户端通信。这意味着服务器转发来自客户端A的消息到客户端B.
现在即时通讯坐在这里和揣摩如何设计的服务器应用程序。
因此,服务器一直在监听接通连接。没关系。对于每一个连接到服务器的新客户端(拨号),服务器都会创建一个新的Socket,并使用线程来让它们同时工作。
每个用户使用一个客户端,每个客户端必须使用用户名和密码进行身份验证。
林寻找一个设计模式来实现服务器上,其存储/处理Socket连接到客户端。
我的第一个想法是创建一个名为ClientManager大Singleton对象包含地图。所以服务器可以调用类似ClientManger.getSocketBy(用户名)来获得所需用户(客户端)的套接字。
这可以解决从客户端A的消息的 “转发” 到客户端B.
对于expample: 用户A(客户端A)希望将消息发送到用户B(客户端B)。因此,服务器接收来自用户A(客户端A)的消息,并调用ClientManager.getSocketBy(用户B)以获取到用户B的通信套接字,然后通过该套接字发送消息。
但在服务器端这个“设计”在我看来,简单的,因为它可以为这样的事情一个很好的设计,和我在想念着类似活动,观察员等
另一种可能丢处理用户B套接字连接instad直接调用Socket.send()方法的线程的事件。
但是,必须有一个更好的办法...
有没有实现这样的事情,你可以推荐一种设计模式,一种常见的方式?我想知道即时信使服务器如何实现这一点?顺便说一下:即时消息不实现即时消息,可扩展性不是最重要的事情,因为没有1000个客户端在同一时间与服务器通信。一个干净的软件设计对我来说更重要。
林实现用于通信的自己的协议(基于XML)。有没有一种方法/设计模式如何在对象中包装协议,或者我没有办法(从软件架构师视图)除外字符串/ XML解析?
之间的映射所以我不想运行在“反模式”... 例如,将用户映射到Socket的Singleton ClientManager对我来说听起来有点奇怪,要拥有这样一个中心对象,必须有更好的方法......我真的想看到(代码)另一个项目将如何实现类似的东西... – sockeqwe
我添加了一个编辑,我同意你不想将套接字绑定到用户。 – tcarvin
连接的抽象是应该明确使用的东西! 我不确定像UserManager这样的中心类是不是一个好主意,但说实话我不知道替代方案。你知道任何? 如果用户有连接或连接有用户。 我的意思是,我应该使用Connection c = ConnectionManager.find(destUserId); 或您描述的方式UserManager.find(destUserId);连接c = UserManager.find(destUserId).getConnection()。 由于安全原因,可能映射到Connection会更好,因为用户可能包含不应该以这种方式访问的信息。 – sockeqwe