我有一个带有DHCP和一些PC的本地网络。其中一个应该是我的服务器并自动连接到所有其他(客户端)。我的想法是这样的: 首先,我在每个从服务器(SClient)监听客户端程序的客户端(CServer)上创建一个服务器。当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();
}
}
}
答案 0 :(得分:22)
我找到了解决问题的方法。它只是用
初始化SocketSocket 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);
非常感谢!
答案 1 :(得分:1)
使用UDP执行此操作要容易得多。一般逻辑是:
您可能遇到多个服务器认为它是此方案中的主服务器的情况,然后您需要一个冲突解决过程,但大纲应该让您大致了解适合您的过程。