线程“main”中的exceptionjava.net.BindException:已在使用的地址 – 仅在Netbeans中出错

在我的机器上,以下代码在Eclipse中编译,但在Netbeans中引发exception。 错误消息显示“线程中的exception”主“java.net.BindException:已在使用的地址”。

Netbeans中用于编译此代码的正确配置是什么? 似乎问题与我有两个主要function的事实有关。 如果我开始运行其中一个应用程序,第二个将无法启动,抛出上面发布的exception。

Server.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); } } 

Client.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 (它实际上省略了#1)第一个过程)。 然后,如果我转到Client.java文件并选择“运行此文件”,它将生成第二个进程, MyTestNetworkingProject run #2 。 然后,它会在屏幕底部生成第二个结果窗口,因为它会在创建新流程时在新选项卡中生成这些窗口。

由于我的特定代码的性质,我希望在结果窗口中看到我确认我的应用程序正在运行的是我想观察Server.java结果窗口(在本例中是MyTestNetworkingProject run #1 )。 鉴于上面列出的运行不同文件的确切步骤顺序,运行#2是最后一个运行过程,因此选项卡位于顶部,覆盖运行#1选项卡。 我可以点击运行#1并查看我希望在控制台中看到的结果(“Hello服务器”),但我只需要知道/记住MyTestNetworkingProject run #1代表Server应用程序而不是Client应用程序。

Uncool,IMO。

问题是由于您让服务器的一个实例运行然后再启动另一个实例。

如果你在Windows操作系统中写这个,你可以使用“netstat -nao”查看哪个进程使用9999端口。如果它是一个不重要的进程,你可以终止这个进程。否则你可以改变pragram的端口。

Server.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(); } } } 

Client.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(); } } } 

参考上面的代码,它适用于我..