我在服务器和客户端之间创建了一个简单的通信。我使用TCP协议,Socket连接。我的服务器(Java程序)可以同时接受多个连接而没有问题。现在,我的任务是使用我的服务器对其中一个客户端(即Andorid应用程序)进行通信,即使其他客户已连接。
我们举一个例子: Client1,Client2和Client3已连接到我的服务器。
我希望Client1向Client2发送内容(但不向Client3发送)。所以我的服务器必须从Client1接收数据,然后将相同的数据发送到Client2。
你能建议什么是最常见/最普通的方法吗?
答案 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