我将在java中实现客户端 - 服务器应用程序。客户端和服务器通过TCP相互通信。只有一个中央服务器,负责处理所有客户端消息。
我不使用RMI进行通信,它们与tcp-socket通信,客户端可以通过服务器与另一个客户端通信。这意味着服务器将消息从客户端A转发到客户端B.
现在我坐在这里,试图弄清楚如何设计服务器应用程序。
所以服务器一直在监听连接。没关系。对于连接到服务器(拨号)的每个新客户端,服务器创建一个新的Socket,我会使用Threads让它们同时工作。
每个用户都使用客户端,每个客户端都必须使用用户名和密码进行身份验证。
我正在搜索要在服务器上实现的设计模式,它存储/处理与客户端的Socket连接。
我的第一个想法是创建一个名为ClientManager的大型Singleton对象,其中包含一个Map。因此,服务器可以调用ClientManger.getSocketBy(用户名)之类的东西来获取所需用户(客户端)的套接字。
这可以解决从客户端A到客户端B的“转发”消息。
例如: 用户A(客户端A)想要向用户B(客户端B)发送消息。因此,服务器从用户A(客户端A)接收消息并调用ClientManager.getSocketBy(用户B)以获取到用户B的通信套接字,然后通过此套接字发送消息。
但是服务器端的这种“设计”在我看来很简单,因为它可能是一个很好的设计,并且我错过了像Events,Observer等的东西。
另一种可能性是将一个Event抛出到Thread,它处理直接调用Socket.send()方法的User B套接字连接instad。
但必须有更好的方法......
有没有一种通用的方法来实现这样的设计模式,你可以推荐?我想知道即时消息服务器如何实现这个?
顺便说一句:我没有实现即时消息,可伸缩性不是最重要的,因为没有1000个客户端同时与服务器通信。干净的软件设计对我来说更重要。
我为通信实现了一个自己的协议(基于xml)。有没有一种方法/设计模式如何将协议包装在一个对象中,或者除了字符串/ xml解析之外我是否可以做任何事情(来自软件架构师视图)?
答案 0 :(得分: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);
Connection conn = destUser.Connection;
if (conn != null)
conn.Send(msg);
请注意,没有提及连接或协议实现细节。
答案 1 :(得分:1)