首页 文章

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

提问于
浏览
-1

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

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

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

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

2 回答

  • 1

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

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

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

    在您的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及其键,您可以获取通信线程并将数据写入特定客户端 .

  • 2

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

相关问题