![](/img/trans.png)
[英]Exception in thread “main” java.net.BindException: Address already in use
[英]Exception in thread "main" java.net.BindException: Address already in use - Error in Netbeans only
在我的機器上,以下代碼在 Eclipse 內編譯但在 Netbeans 內拋出異常。錯誤消息顯示“線程“主”java.net.BindException 中的異常:地址已在使用中”。
Netbeans 中使這段代碼編譯的正確配置是什么? 看來問題與我有兩個主要功能有關。 如果我開始運行其中一個應用程序,第二個應用程序將無法啟動,拋出上面發布的異常。
服務器.java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
Server myServ = new Server();
myServ.run();
}
public void run() throws Exception {
ServerSocket mySS = new ServerSocket(9999);
Socket SS_accept = mySS.accept();
InputStreamReader mySR = new InputStreamReader(SS_accept.getInputStream());
BufferedReader myBR = new BufferedReader(mySR);
String temp = myBR.readLine();
System.out.println(temp);
}
}
客戶端.java
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
Client myCli = new Client();
myCli.run();
}
public void run() throws Exception {
Socket mySkt = new Socket("localhost", 9999);
PrintStream myPS = new PrintStream(mySkt.getOutputStream());
myPS.println("Hello server");
}
}
問題是由於您讓服務器的一個實例運行然后啟動了另一個實例。
實現我想要的方法是右鍵單擊我想要運行的特定類(例如Server.java
)並選擇“運行此文件”。 這使我能夠僅運行服務器應用程序。 然后,對另一個文件Client.java
執行相同的過程。
然而,在這種特殊情況下,Netbeans 有點令人困惑/欺騙。 Netbeans 所做的是它運行Server
進程,但將該進程標記為項目名稱(例如 MyTestNetworkingProject)並在其上放置一個運行號,從而為我們提供MyTestNetworkingProject run #1
(它實際上在第一個過程)。 然后,如果我轉到 Client.java 文件並選擇“運行此文件”,它會生成第二個進程MyTestNetworkingProject run #2
。 然后它會在屏幕底部生成第二個結果窗口,因為它會在創建新進程時在新選項卡中生成這些結果。
由於我的特定代碼的性質,我想在結果窗口中看到以確認我的應用程序正在運行的內容是我想觀察 Server.java 結果窗口(在本例中為MyTestNetworkingProject run #1
)。 鑒於我上面列出的運行不同文件的確切步驟順序,運行 #2 是最后一個運行過程,因此頂部的選項卡覆蓋了運行 #1 選項卡。 我可以單擊 run #1 並查看我希望在控制台中看到的結果(“Hello server”),但我只需要知道/記住MyTestNetworkingProject run #1
代表服務器應用程序而不是客戶端應用程序。
不酷,海事組織。
如果你在windows操作系統下寫這個,可以用netstat -nao查看哪個進程使用了9999端口。如果是一些不重要的進程,你可以殺掉這個進程,否則你可以改變程序的端口。
我更改了端口地址,它在 Neat Beans IDE 中對我有用。如果我們多次使用相同的端口地址,就會出現此問題。 所以要修復此錯誤,您必須更改端口地址,我相信它會起作用
服務器端.java
public class SocServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(5001);
Socket client = server.accept();
DataOutputStream os = new DataOutputStream(client.getOutputStream());
os.writeBytes("Hello Sockets\n");
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端.java
public class SocClient {
public static void main(String[] args) {
try {
Socket socClient = new Socket("localhost", 5001);
InputStream is = socClient.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String receivedData = br.readLine();
System.out.println("Received Data: " + receivedData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
參考上面的代碼,它對我有用..
我確實嘗試了方法catch
並解決了問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.