[英]Scanning a LAN for a Socket?
我正在創建一個基本的小游戲,但我希望它能夠使用套接字在LAN上進行掃描。我當前的代碼有效,但是它粗糙而緩慢。
我當前的代碼是這樣工作的,它獲取當前計算機的前2個八度音階(例如192.168),然后執行對偶循環(0-255)從192.168.0.0掃描到192.168.255.255,在我看來這是一個非常掃描局域網中所有IP的低效方法。
這是代碼:
new Thread(new Runnable() {
@Override
public void run() {
int next = 0;
try{
String ipAd = InetAddress.getLocalHost().getHostAddress();
String ipStart = ipAd.substring(0, NetHandler.nthOccurrence(ipAd, '.', 2)-1);
Socket s;
for(int i = 0 ; i < 255; i++){
for(int j = 0 ; j < 255; j++){
s = new Socket();
String ip = ipStart + (i + "." + j);
tests++;
server = ip;
try{
s.connect(new InetSocketAddress(ip, 26655), 10);
}catch(Exception e){
continue;
}
servers[next++] = ip;
componentList.add(new GuiButton(ids++, GuiMultiplayer.this, SpaceGame.WIDTH/2, SpaceGame.HEIGHT/4 - 60 + (50 * ids), ip));
}
}
}catch(Exception e){
}
}
}).start();
}
有沒有更簡單的方法可以列出我的LAN網絡上的所有設備? 還是我的粗慢解決方案是唯一的方法?
此怪獸的預覽:
通常,使用UDP廣播發現局域網上應用程序的運行實例。 讓發出請求的應用程序在預定端口上向LAN的子網廣播IP發送一條請求消息,該消息會將消息復制到連接到該子網的每台PC上的該端口。 您的其他應用程序可以在該端口上打開UDP偵聽套接字以接收請求。 每個應用程序收到請求后,將獲得請求者的IP,並可以直接向其發送回復,從而使請求者可以發現復制者。 發送初始請求后,請求者可以等待一段時間,以收集收到的所有答復,然后根據需要使用該信息。
我的建議是對應用程序進行多線程處理,以便您一次啟動多個連接。 如果您以前沒有做過多線程Java應用程序,請查看Java Concurrency教程 ,了解如何執行此操作。
編輯:您當然也可以在評論中將此與其他人的建議結合起來。 實際上,在處理並發之前,我可能會使用他們的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.