Java-在网络中查找服务器
当我不知道ip时,我想在我的网络中找到我的服务器。 这就是我的代码,但测试所有IP确实需要(!)很长时间:Java-在网络中查找服务器,java,sockets,networking,Java,Sockets,Networking,当我不知道ip时,我想在我的网络中找到我的服务器。 这就是我的代码,但测试所有IP确实需要(!)很长时间: for (int j = 1; j < 255; j++) { for (int i = 1; i < 255; i++) { String iIPv4 = "192.168." + j + "."; try { Socket socket = new Socket(); SocketAddress ad
for (int j = 1; j < 255; j++) {
for (int i = 1; i < 255; i++) {
String iIPv4 = "192.168." + j + ".";
try {
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress(iIPv4 + i, 2652 );
socket.connect(address, 5);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String fromServer;
while ((fromServer = in.readLine()) != null) {
if (fromServer.equals("Connected to CC3000")) {
System.out.println("CC3000 found! : " + iIPv4 + i);
return iIPv4 + i;
}
}
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
}
for(int j=1;j<255;j++){
对于(int i=1;i<255;i++){
字符串iIPv4=“192.168.+j+”;
试一试{
套接字=新套接字();
SocketAddress地址=新的InetSocketAddress(iIPv4+i,2652);
插座连接(地址5);
BufferedReader in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
来自服务器的字符串;
而((fromServer=in.readLine())!=null){
if(fromServer.equals(“连接到CC3000”)){
System.out.println(“找到CC3000!:”+iIPv4+i);
返回iIPv4+i;
}
}
}捕获(未知后异常e){
}捕获(IOE异常){
}
}
}
那么,找到服务器的更好方法是什么
关于我认为多线程可以帮助您,因为您不希望等待每个连接建立或失败。 你可以试着一次说几百个插座。另外,检查IP是否可访问可能会为您节省一些时间 下面的代码确实是一个幼稚而可怕的例子,因为根本没有线程管理,但我希望您能理解。你应该更快地得到结果
public static void findLanSocket(final int port, final int timeout) {
List<Thread> pool = new ArrayList<>();
for (int j = 1; j < 255; j++) {
for (int i = 1; i < 255; i++) {
final String iIPv4 = "192.168." + j + "." + i;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("TESTING: " + iIPv4);
try {
// First check if IP is reachable at all.
InetAddress ip = InetAddress.getByName(iIPv4);
if (!ip.isReachable(timeout)) {
return;
}
// Address is reachable -> try connecting to socket.
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress(ip, port);
socket.connect(address, timeout);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String fromServer;
while ((fromServer = in.readLine()) != null) {
if (fromServer.equals("Connected to CC3000")) {
System.out.println("CC3000 found! : " + iIPv4);
}
}
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
});
pool.add(thread);
thread.start();
}
}
// Wait for threads to die.
for (Thread thread : pool) {
try {
if (thread.isAlive()) {
thread.join();
}
} catch (InterruptedException ex) {
}
}
}
公共静态void findLanSocket(最终int端口,最终int超时){
列表池=新的ArrayList();
对于(int j=1;j<255;j++){
对于(int i=1;i<255;i++){
最终字符串iIPv4=“192.168.+j+”+i;
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{
系统输出打印项次(“测试:+iIPv4);
试一试{
//首先检查IP是否可以访问。
InetAddress ip=InetAddress.getByName(iIPv4);
如果(!ip.isReachable(超时)){
返回;
}
//地址可访问->尝试连接到套接字。
套接字=新套接字();
SocketAddress地址=新的InetSocketAddress(ip,端口);
socket.connect(地址、超时);
BufferedReader in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
来自服务器的字符串;
而((fromServer=in.readLine())!=null){
if(fromServer.equals(“连接到CC3000”)){
System.out.println(“找到CC3000!:”+iIPv4);
}
}
}捕获(未知后异常e){
}捕获(IOE异常){
}
}
});
pool.add(线程);
thread.start();
}
}
//等待线程死亡。
for(线程:池){
试一试{
if(thread.isAlive()){
thread.join();
}
}捕获(中断异常例外){
}
}
}
如果您知道服务器的主机名和域,您可以直接使用它。这需要很长时间!您正在尝试对每个主机执行TCP连接。让您的服务器监听广播/多播数据包并做出响应(假设本地局域网-类似于UPnP的工作方式)怎么样?DNS失败?@RomanC我知道,但我想让它变得动态。@chrixm不知道你的确切意思。你能给我解释一下如何通过广播来实现吗?正如其他评论所说,这不是最好的解决方案。这就是说,由于您可能在本地LAN上,因此可以通过将连接超时减少到500毫秒来加快速度。