创建新Socket时添加超时

我有一个带DHCP的本地网络和几台PC。 其中一个应该是我的服务器并自动连接到所有其他(客户端)。 我的想法是这样的:首先,我在每个客户端(CServer)上创建一个服务器,它从服务器(SClient)监听客户端程序。 当SClient连接到CServer时,SClient向CServer发送他的IP,因此他知道该IP上将有服务器。 然后在尝试IP范围内的所有IP(例如192.168.1.xxx)后,他启动真实服务器,并且所有客户端都连接到已知的服务器IP。 但是,当我尝试以下操作时,SClient在尝试连接到192.168.1.0时只在第一个IP冻结。 我如何定义超时或类似的东西,让SClient丢弃不成功的连接并继续使用192.168.1.1?

import java.lang.*; import java.io.*; import java.net.*; class SClient { public SClient() { for(int i = 120; i < 125; i++){ try{ InetAddress addr = InetAddress.getLocalHost(); String addrs = addr+""; String ip = addrs.substring(addrs.indexOf("/")+1); Socket s1 = new Socket("192.168.1." + i, 1254); OutputStream s1out = s1.getOutputStream(); DataOutputStream dos = new DataOutputStream (s1out); dos.writeUTF(ip); dos.close(); s1out.close(); s1.close(); }catch(IOException e){} } } } 

 import java.lang.*; import java.io.*; import java.net.*; class CServer { public CServer() throws IOException{ ServerSocket s = new ServerSocket(1254); while(true){ Socket s1=s.accept(); InputStream s1In = s1.getInputStream(); DataInputStream dis = new DataInputStream(s1In); String st = new String (dis.readUTF()); System.out.println(st); dis.close(); s1In.close(); s1.close(); } } 

}

我找到了解决问题的方法。 它只是初始化Socket而不是

 Socket s1 = new Socket("192.168.1." + i, 1254); 

但随着

 Socket s1 = new Socket(); s1.setSoTimeout(200); s1.connect(new InetSocketAddress("192.168.1." + i, 1254), 200); 

不管怎么说,还是要谢谢你!

用UDP做这件事要容易得多。 一般逻辑是:

  1. 确定一个众所周知的“发现”端口
  2. 任何启动的计算机都会发出“查询主服务器”消息
  3. 如果在您定义的时间范围内未收到该消息的响应,则发送它的计算机会自动将其指定为服务器。
  4. 此后,任何发出“查询主服务器”消息的计算机都将从主服务器获得响应,其IP地址和“通信端口”
  5. 从新机器连接到通信端口上的服务器并开始发送消息。

您可能遇到多个服务器认为它是此方案中的主服务器的情况,然后您需要一个冲突解决过程,但大纲应该让您大致了解适合您的过程。