1

我将在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解析?

回答

2

你有两个问题我想。

第一个是关于什么“设计模式”用于您的路由。你表明你在做什么,但你没有说明你正在经历(或预期经历)的问题,只是说它太简单了。模式是解决常见问题的常见方式,但是一个程序太简单并不是我见过的模式:)

第二个问题是关于从使用它的客户端分离协议的实现。现在是一个很好的问题,你肯定应该做的。您将要创建一个公开字段的Message对象(如To,From,Content等)。您的服务器需要将原始xml数据传递给某些类型的解析器,该解析器充当消息对象的Factory。

Message msg = protocol.CreateMsg(byte[] xmlBuffer) 

可以通过分配不同的一个到每个TCP/IP端口或通过用默认协议开始,然后具有在客户端和服务器协商一个不同的协议支持附加协议。

EDIT1:

我不会套接字映射到用户,说实话。我会将您与用户交流的方式抽象为一个对象,可能是Connection或Channel。然后,您可以使用TcpConnection或CorbaConnection或其他类来继承Connection。理想情况下,您正在执行如下操作:

string destUserId = msg.To; User destUser = UserManager.Find(destUserId); 连接conn = destUser.Connection; if(conn!= null) conn.Send(msg);

请注意,没有提及连接或协议实现的详细信息。

+0

之间的映射所以我不想运行在“反模式”... 例如,将用户映射到Socket的Singleton ClientManager对我来说听起来有点奇怪,要拥有这样一个中心对象,必须有更好的方法......我真的想看到(代码)另一个项目将如何实现类似的东西... – sockeqwe

+0

我添加了一个编辑,我同意你不想将套接字绑定到用户。 – tcarvin

+0

连接的抽象是应该明确使用的东西! 我不确定像UserManager这样的中心类是不是一个好主意,但说实话我不知道替代方案。你知道任何? 如果用户有连接或连接有用户。 我的意思是,我应该使用Connection c = ConnectionManager.find(destUserId); 或您描述的方式UserManager.find(destUserId);连接c = UserManager.find(destUserId).getConnection()。 由于安全原因,可能映射到Connection会更好,因为用户可能包含不应该以这种方式访问​​的信息。 – sockeqwe

1

您尝试了服务定位器模式吗?但Java已经实现了你的核心内容,为什么“重新发明轮子”。您可以使用CORBA或基于TCP/UDP的框架之一,如ICE,如果您不喜欢RMI,并且这将真正帮助您构建您的分布式应用程序。

+0

谢谢你的答复,但我不能使用CORBA,RMI或ICE等技术。 而我的问题是,如何在服务器端设计用户之间的通信通道(一个插座,RMI,冰,或其他) – sockeqwe