线程“main”中的异常java.net.BindException:已在使用的地址 - 仅在Netbeans中出错

时间:2013-02-04 03:04:47

标签: java netbeans

在我的机器上,以下代码在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");

    }

}

6 个答案:

答案 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 并解决了问题。