Java - 在客户端识别来自服务器的发送对象和发送到所有消息

时间:2016-03-18 16:28:05

标签: java multithreading sockets

我正在开发一个服务器/客户端应用程序,允许在任何给定时间将多个客户端连接到服务器。 对于每个客户端,服务器设置一个ClientHandler对象,该对象具有到此套接字连接的客户端的输入和输出流。通过此连接,客户端可以在程序运行过程中随时向服务器发送大量消息,服务器将根据消息进行响应。

我需要实现的是一种在某些时候向所有当前连接的客户端发送消息的机制。我通过将所有输出流存储到ArrayList<PrintWriter>中的客户端来完成此操作,这将允许将相同的消息发送到所有客户端。

我正在努力的是:<​​/ p>

当收到客户端的个人消息时,客户端GUI会相应更新(只能发送一定数量的消息,因此客户端处理的服务器只有一定数量的可能响应) - 如果声明)。但是,当客户端收到发送给所有客户端的消息时,我希望客户端以完全不同的方式更新GUI。

考虑到两种形式的输入来自相同的输入流,我可以看到这很困难,我预计我必须声明任何导致使用PrintWriter输出的方法必须{ {1}}。但是,有没有办法在使用相同的synchronized时处理不同的输入?这是否必须使用其他PrintWriter语句来完成,还是可以在客户端使用单独的if来处理发送给所有客户端的消息?

感谢您的任何建议,如果您认为可以提供帮助,请随时询问我现有代码的部分内容!

标记

2 个答案:

答案 0 :(得分:3)

首先,您的服务器和客户之间缺少协议!

显然,服务器可以发送两种类型的消息&#34;响应&#34;和&#34;广播&#34;。 一种相当简单的方法是标记您的消息:例如在你的消息前加上&#34; R&#34;如果它是对请求的响应并且使用&#34; B&#34;如果是无人看管的广播消息。 (这完全取决于如何执行服务器和客户端之间的通信。)

您的客户是否需要不同的线程来处理消息是一个完全不同的故事。如果客户端中的处理活动会阻止及时读取套接字,则使用不同的线程非常有用。然后,您可能会考虑使用正在进行通信的I / O线程,并将消息分派给不同的处理程序&#34; (可以是其他线程)进行处理。 (此I / O线程也可以删除标记,使得现有处理代码无需了解服务器的较低协议。)

类似的推理可能适用于您的服务器端。根据交互的动态和请求的处理,您可能会使用多个线程。那么你应该有一个正在与客户和正在做工作的其他人做I / O(生成响应或广播消息)

答案 1 :(得分:1)

     When your clients connect to the server, your server creates a Socket for it, here it is Socket socket = ss.accept();, your socket variable will be holding that client.

现在,如果您只是将您的客户端套接字添加到while循环中的arraylist,您将拥有一个与您的服务器主动连接的客户端列表,如:

接受后:

  clients = new ArrayList<DataOutputStream>();
  Socket socket = ss.accept();
  os = new DataOutputStream(socket.getOutputStream());
  clients.add(os);

现在,由于您拥有该客户端arraylist中的所有客户端,您可以循环访问它,或者使用某些协议定义在阅读后我应该发送数据的客户端。