“线程中的异常”;“主要”;java.net.BindException:地址已在使用中-仅在Netbeans中出错
在我的机器上,以下代码在Eclipse中编译,但在Netbeans中引发异常。错误消息显示“线程中的异常”main“java.net.BindException:地址已在使用” Netbeans中使代码编译的正确配置是什么?问题似乎与我有两个主要功能有关。如果我开始运行其中一个应用程序,第二个应用程序将无法启动,引发上面发布的异常 Server.java“线程中的异常”;“主要”;java.net.BindException:地址已在使用中-仅在Netbeans中出错,java,netbeans,Java,Netbeans,在我的机器上,以下代码在Eclipse中编译,但在Netbeans中引发异常。错误消息显示“线程中的异常”main“java.net.BindException:地址已在使用” Netbeans中使代码编译的正确配置是什么?问题似乎与我有两个主要功能有关。如果我开始运行其中一个应用程序,第二个应用程序将无法启动,引发上面发布的异常 Server.java import java.io.*; import java.net.*; public class Server { public
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);
}
}
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
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");
}
}
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();
}
}
}
如果你在Windows操作系统中写这个,你可以使用“netstat-nao”来查看哪个进程使用9999端口,您可以终止此进程。否则,您可以更改pragram的端口。问题是您让服务器的一个实例运行,然后启动了另一个实例。实现我想要的方法是右键单击我想要运行的特定类(例如,
server.java
),然后选择“运行此文件”. 这使我只能运行服务器应用程序。然后,对另一个文件执行相同的过程,Client.java
然而,在这种特殊情况下,Netbeans有些混乱/欺骗。Netbeans所做的是运行服务器
进程,但将该进程标记为项目名称(例如MyTestNetworkingProject),并在其上添加运行编号,从而为我们提供MyTestNetworkingProject运行#1
(实际上在第一个进程上省略了#1)。然后,如果我转到Client.java文件并选择“运行此文件”,它将生成第二个进程,MyTestNetworkingProject Run\2
。然后,它在屏幕底部生成第二个结果窗口,在创建新流程时在新选项卡中生成这些结果
由于我的特定代码的性质,我希望在结果窗口中看到的是我的应用程序正在工作,我希望观察Server.java结果窗口(在本例中是MyTestNetworkingProject run#1
)。考虑到我上面列出的运行不同文件的确切步骤顺序,run#2是最后一个运行进程,因此是顶部的选项卡,覆盖了run#1选项卡。我可以单击run#1并在控制台中看到我希望看到的结果(“Hello server”),但我必须知道/记住,MyTestNetworkingProject run#1
代表服务器应用程序,而不是客户端应用程序
Uncool,IMO.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);
}
}
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
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");
}
}
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
,并解决了问题。确保只在Eclipse或NetBeans中运行Server
类。否则,如果要同时运行两台服务器,请更改端口号。如果不在Netbeans中,我应该在哪里运行客户端应用程序?另外,这两台服务器是什么意思?只有一个服务器应用程序。您在eclipse上运行的是哪个类,在netbeans上运行的是哪个类?不,不……我试图在netbeans上开发它(两个类)。当我遇到麻烦时,我转向Eclipse,在那里开发了这两个类,我没有任何问题。所以我的问题是…在Netbeans中,如何成功运行这两个类/应用程序?如果您查看代码,一旦服务器应用程序运行,客户端应用程序就可以启动,并使用套接字与服务器应用程序交互。我尝试了各种端口号,结果相同。另外,我的操作系统是linux。我知道如何手动杀死Netbeans中的进程,所以我认为这不是问题所在。事实上,我甚至完全关闭IDE并重新启动。也许我没有正确启动我的应用程序?当您使用publicstaticvoidmain(String[]args)
运行2个或更多类时,Eclipse控制台中会出现类似情况。我不认为这是IDE的问题。尽管存在明显的套接字泄漏,但它确实可以为您工作,但它并不能以任何方式回答这个问题。