Java 多个服务器套接字、多个设备和发送到多个套接字

Java 多个服务器套接字、多个设备和发送到多个套接字,java,android,sockets,Java,Android,Sockets,我的公司为我们的系统创建了自己的定制android硬件 我们目前有两台android设备,需要一起通信并同步其中的sqlite数据库 我开始编写一个自定义套接字协议来解决这个问题。这是基于服务器-客户机模型的。然而,随着我进行更多的开发,我发现每个设备都需要运行一个服务器套接字,系统中有可能有3个或更多设备进行通信,而且服务器可能会死机、重新启动或崩溃 因此,我的想法是让每个设备搜索我存储在阵列中的一组端口,并在设备检查时绑定到当前可用的端口,然后围绕该端口创建我的ServerSocket 这意

我的公司为我们的系统创建了自己的定制android硬件

我们目前有两台android设备,需要一起通信并同步其中的sqlite数据库

我开始编写一个自定义套接字协议来解决这个问题。这是基于服务器-客户机模型的。然而,随着我进行更多的开发,我发现每个设备都需要运行一个服务器套接字,系统中有可能有3个或更多设备进行通信,而且服务器可能会死机、重新启动或崩溃

因此,我的想法是让每个设备搜索我存储在阵列中的一组端口,并在设备检查时绑定到当前可用的端口,然后围绕该端口创建我的ServerSocket

这意味着可能device1有ServerSocket(1111),device2有ServerSocket(1112),等等

然后,每个设备通过多个端口发送消息。 例如:device1遍历阵列并打开客户端套接字,并为每个端口发送消息: 插座=新插座(IP,1112); 发送消息。。。 插座=新插座(IP,1113); 发送消息。。。 等

当然,我已经使这个多线程(由安卓服务运行)在安卓设备中不会阻塞UI线程

我的问题是,我做得对吗?还是Java中有更好的方法来实现这一点

编辑:

我决定添加一些代码来解释我的问题

我有多个android设备通过TCP/IP连接在一起,我在每个设备上创建一个ServerSocket,如下所示:

ServerSocket serverSocket = new ServerSocket(4000);
现在,当第二个设备尝试此操作时,它在Java中给了我一个错误,因为套接字正在被另一个设备使用。他们的IP地址类似于172.23.3.128和172.23.3.127


因此,即使有不同的IP地址,我也会从Java中得到一个错误,即我已经绑定到该端口/IP,这是正确的。这是我不理解的。

基本上服务器需要无故障运行,您的想法是服务器中断。否则,您可以使用单个服务器,该服务器在一个端口中接受来自多个客户端的连接,例如:500050015002等

修复每个客户端的套接字端口。服务器会在您尝试时打开一个阵列


通过多个端口发送消息是什么意思?为每个客户端使用一个端口,否则您无法识别哪个客户端正在发送消息。

这没有意义。每个设备都必须有自己的IP地址:它们也不需要不同的端口号。它们都可以使用相同的端口号。

您还可以:

  • 让客户端监听特定的UDP端口
  • 让客户端也连接到该端口,通知它们的存在
  • 一旦客户端接收到广播,它们就可以通过TCP或UDP发起从临时端口到预先确定的辅助端口的直接连接

至少通常是这样做的。

这里的问题是每个客户端都需要充当服务器。基本上,每个设备都会打开一个ServerSocket,并将信息发送到不同的端口。使用UDP,我们仍然是一个1服务器、多客户端的模型。@Juan,也许你误解了。所有的客户都做同样的事情;没有“服务器”。所有的客户都在广播他们的存在,也在收听其他人的广播。我相信你是对的。然而,这是行不通的。当我在java中的特定端口注册ServerSocket时,我无法再次从另一个设备注册到它,我只能从客户端向该端口发送消息。我将添加一些代码。好的,这样我就知道断开连接的地方了。在我对这项工作感到困惑的时候,我试图在同一台设备上打开同一个端口(我为每台设备使用一个终端,我对其他设备使用telnet),那是周五晚上。今天早上我来了,又看了一遍这个问题,我明白了。谢谢我知道这种感觉:-)很好,很乐意帮忙。基本上每个客户都需要打开serverSocket。我确实像你说的那样创建了这个阵列,它似乎工作得很好。我只是想知道这是不是正确的方向。