服务器与三个连接的客户端Android / Java之一之间的通信

时间:2016-02-03 14:09:02

标签: java android sockets server client

我在服务器和客户端之间创建了一个简单的通信。我使用TCP协议,Socket连接。我的服务器(Java程序)可以同时接受多个连接而没有问题。现在,我的任务是使用我的服务器对其中一个客户端(即Andorid应用程序)进行通信,即使其他客户已连接。

我们举一个例子: Client1,Client2和Client3已连接到我的服务器。

我希望Client1向Client2发送内容(但不向Client3发送)。所以我的服务器必须从Client1接收数据,然后将相同的数据发送到Client2。

你能建议什么是最常见/最普通的方法吗?

2 个答案:

答案 0 :(得分:2)

如果您已经以多线程方式提供服务器和客户端之间的连接,那么您可以考虑一个小应用程序" Hello"协议

如果建立了客户端/服务器连接,请告诉所有其他客户端有关新客户端的信息。如果客户端/服务器连接退出,也告诉他们。

您可以通过向所有客户端发送所有现有连接/客户端的列表来完成此操作。

在你的android-app中,你应该有机会选择收件人,在服务器端,你可以查看收到的邮件并将其转发给客户端。

我之前使用多个蓝牙客户端制作了这样的应用程序,并为包含收件人字段和邮件的邮件选择了JSON。

正如您在评论中所说,您的服务器的工作方式如下one

一个可能的(但不是非常完美的解决方案)就是写一个类似于它的类(命名也不是很好,但适合你的例子):

public class ServerApplication {
     ServerSocket ssocket;
     static HashMap<String, MultiThreadedServer> connectionMap = new HashMap<String, MultiThreadedServer>();

     public static void main(String args[]) 
     throws Exception {

           ServerSocket ssock = new ServerSocket(1234);
           System.out.println("Listening");
           while (true) {
               Socket sock = ssock.accept();
               System.out.println("Connected");
               //new Thread(new MultiThreadServer(sock)).start();
               Thread t = new Thread(new MultiThreadedServer(sock));
               t.start();                 
               connectionMap.put(sock.getRemoteSocketAddress().toString(), t);
           }
     }

     public static class MultiThreadServer implements Runnable {
          Socket csocket;


          MultiThreadServer(Socket csocket) {
               this.csocket = csocket;
          }


     public void run() {
         while(true) {
            //read the data and look from which client it comes
         }
     }

     public synchronized void write(String s) {
         //in this method, you can write data to the socket for a specific client
     }
 }

现在你有一个HashMap,其中包含客户端(客户端)的ip-Adress作为密钥以及发生通信的相应线程。

您可以考虑使用Message-Class或类似的东西来指定哪个客户端发送了消息。一个例子:

public class Message {
     String sender; //here the ip-address from the sender
     String recipient; //here the ip-adress of the client
     String message; //here the message content
}

使用序列化技术(如json),您可以将此类对象转换为可写入套接字的字符串。在服务器端,您可以将字符串转换回Message-Object并由recipient-field决定,应该对哪个客户端进行处理。通过使用HashMap及其键,您可以获取通信线程并将数据写入特定客户端。

答案 1 :(得分:1)

针对此类情况的最流行的解决方案是使用谷歌GCM等推送通知服务。 如果您出于某种原因想要开发解决方案,我建议使用“nginx-push-stream-module”。使用此模块,您可以为每个客户端分配一个通道ID。然后通过提供他们的频道ID将消息推送到客户端。 看看:https://github.com/wandenberg/nginx-push-stream-module