在我的机器上,以下代码在Eclipse中编译,但在Netbeans中引发异常。错误消息显示“线程中的异常”主“java.net.BindException:地址已在使用中”。
Netbeans中用于编译此代码的正确配置是什么?似乎问题与我有两个主要功能这一事实有关。如果我开始运行其中一个应用程序,第二个将无法启动,抛出上面发布的异常。
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");
}
}
答案 0 :(得分:4)
实现我想要的方法是右键单击要运行的特定类(例如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
代表服务器应用程序而不是客户端应用程序。
Uncool,IMO。
答案 1 :(得分:2)
问题是由于您让服务器的一个实例运行然后再启动另一个实例。
答案 2 :(得分:1)
该问题是由于您让服务器的一个实例处于运行状态,然后又启动了一个实例。要解决此问题,您应该重新启动设备
答案 3 :(得分:0)
如果你在Windows操作系统中写这个,你可以使用“netstat -nao”查看哪个进程使用9999端口。如果这是一个不重要的过程,你可以终止这个过程。否则你可以改变pragram的端口
答案 4 :(得分:0)
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();
}
}
}
参考上面的代码,它对我有用..
答案 5 :(得分:-1)
我确实尝试了方法 catch
并解决了问题。