"Address already in use" 接收数据报中的 DataramSocket

"Address already in use" DataramSocket in receive datagram

我有一个问题(很明显)。我是 java 中的 UDP 菜鸟。抱歉。

我正在制作一个发送和接收 UDP datagrams.The idea 的应用程序 运行 2 次相同的程序和发送和接收数据包,这是我用线程做的。问题是,收到这个程序总是给我同样的信息。

java.net.BindException: Address already in use

这与我在使用中尝试打开的端口有关,但我会使用您尝试打开的任何端口,80、8080、12345。 连watch online command ports都是免费的,不过你说谁也一样忙。

netstat -a

密码是:

发件人

class envioNodo extends Thread {
byte[] tablaEnca = new byte[10000];
int port = 0;
int puertoVecino = 0;
String IP_envio = "" , IP_emisor ="";
public envioNodo(String tE , String IP , int puerto , String IP_e) {
    port = puerto;
    IP_envio = IP;
    IP_emisor = IP_e;
    System.out.println("Se enviará el vector de distancias a la IP "+ IP_envio +" con puerto "+ port);
}
public void run() {
    System.out.println("Se ejecuta el envio de paquetes del nodo");
    try {
        DatagramSocket dS = new DatagramSocket(); // null //Sin null envia los datos por un puerto cualquiera udp

        dS.setReuseAddress(true);

        DatagramPacket dP = null;
            try {
                dP = new DatagramPacket(tablaEnca , tablaEnca.length, InetAddress.getByName(IP_envio)  , port); 
                dS.send(dP);
                System.out.println("Paquete enviado");

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e){
                e.printStackTrace();
            }
            try {
                dS.send(dP);
            } catch (IOException e) {
                e.printStackTrace();
            } 
            dS.close();

    } catch (SocketException e) {
        e.printStackTrace();
    }
}

}

收到

class recepcionNodos extends Thread {
int port = 0;
String vD_rN ;
byte[] buff = new byte[10000];
DatagramPacket dP = null;
DatagramSocket dS = null;
public recepcionNodos(int puerto){
    port = puerto;
    System.out.println("Inicio del hilo de espera de respueta");
    System.out.println("El puerto por el que se escuchara es el "+ port);
}
public void run(){
    do{
        try {
            System.out.println("Comienzo recepcion");
            port++;
            dS = new DatagramSocket(port);
            dP = new DatagramPacket(buff,buff.length);
            System.out.println("Espera en el receive");
            dS.receive(dP);
            vD_rN = new String(dP.getData()).substring(0,dP.getLength());
            System.out.println("String recibido.");
            System.out.print(vD_rN);
            System.out.println("Paquete recibido!");
        } catch (IOException e) {
            System.out.println("Error en recepcion del paquete!");
            e.printStackTrace();
            System.exit(1);
        }

    }while(true);
}

Whit DatagramSocket 和 DatagramPacket = null。

I Start whit send DatagramSocket = new DatagramSocket(); 在这个位置构造函数得到第一个端口可以发送数据报,但是接收我不知道,怎么办不能收到数据包 UDP?

编辑:我有 2 个接口 10.0.0.1 10.0.0.2 和 运行 一个程序和一个接口:

Sudo ip addr add

解决方案:

class recepcionNodos extends Thread {
    int port = 0 , aux = 0;
    String vD_rN ;
    byte[] buff = new byte[10000];
    DatagramPacket dP = null;
    DatagramSocket dS = null;
    public recepcionNodos(int puerto){
        port = puerto;
        System.out.println("Inicio del hilo de espera de respueta");
        System.out.println("El puerto por el que se escuchara es el "+ port);
    }
    public void run(){
        do{
            try {
                System.out.println("Comienzo recepcion");
                port++;
                dS = new DatagramSocket(port);

                dP = new DatagramPacket(buff,buff.length);
                System.out.println("Espera en el receive");
                dS.receive(dP);
                vD_rN = new String(dP.getData()).substring(0,dP.getLength());
                System.out.println("String recibido.");
                System.out.print(vD_rN);
                System.out.println("Paquete recibido!");
            } catch (IOException e) {
                System.out.println("Error en recepcion del paquete!");
                e.printStackTrace();
                e.printStackTrace();
                Rip r = new Rip();
                port = Rip.generarPuerto(); // and this function
                System.out.println(port);
                if(aux != 0)
                 System.exit(1);
                aux++;

            }

        }while(true);
    }

这是:

public static int generarPuerto() {
        int aux = 0;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Random r = new Random();
        r.setSeed(r.nextLong());
        aux = r.nextInt(49151 - 1024 - 1) + 1024;
        return aux;
}

我的问题是:

2 个接口:

10.0.0.1
10.0.0.2

和 运行 在应用程序中有 1 个 IP 和其他有其他 IP,但我认为端口是独立的。我用这个功能没有问题,但现在有问题我无法接收消息。

PD : 任何有经验或声望的人都想改造 post 是免费的。 PD2:抱歉,很长 post 并且编辑了很多。 PD3 :非常感谢您的帮助,这个论坛是解决问题编程的最佳场所。

您需要先关闭套接字,然后再打开另一个套接字。 例如:

do{
    try {
        //Create a new socket.
        dS = new DatagramSocket(port);
        dP = new DatagramPacket(buff,buff.length);
        dS.receive(dP);
        vD_rN = new String(dP.getData()).substring(0,dP.getLength());
        System.out.println(vD_rN);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
       //Close the socket and free the port after the message was received.
       if (dS != null) {
           dS.close();
       }
    }
}while(true);

您一次只能将一个套接字绑定到一个端口。

由于您在本地 运行 程序两次,所以两个套接字都试图绑定到同一个端口。

有几个可能的修复方法:

  1. 在不同的端口上有两个独立的程序。
  2. 有一种在运行之间更改端口的简单方法。
  3. 如果原始端口正在使用,则自动更改端口。

我建议最后一个选项。如果发现该错误,请尝试绑定到辅助端口。当您尝试发送数据包时,将其发送到两个套接字。那将是一个快速简单的解决方案。

问题出在你的端口上。检查您的服务器代码端口。如果在同一系统上有两个服务器 运行,当端口号相同时,第二个服务器将永远不会启动,因为它已被第一个服务器使用。

解决方法:在两个Server中使用两个不同的端口号。例如,第一个服务器程序为 7070,第二个服务器程序为 7080。

"Address already bind exception",您只能在特定端口上创建一个到 运行 的套接字。由于发送方和接收方都在同一个程序中,您可以为发送方和接收方使用不同的端口并尝试一下。