“已使用的地址”DataramSocket接收数据报

时间:2015-04-23 18:29:14

标签: java sockets udp datagram

我有一个问题(显然)。我在UDP中的noob很抱歉。

我正在制作一个发送和接收UDP数据报的应用程序。运行2次相同程序并发送和接收数据包的想法,我正在使用线程。问题,收到这个程序总是给我相同的信息。

java.net.BindException: Address already in use

它与我尝试在使用中打开的端口有关,但我使用您尝试的任何端口,80,8080,12345。 即使观看在线指挥端口也是免费的,但如果你告诉我谁同样忙碌。

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。

我开始发送 DatagramSocket = new DatagramSocket(); 在这个位置构造函数获取第一个端口可以发送数据报,¿但接收我不知道,怎么办不能收到UDP的数据包?

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

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

并在一个应用程序whit 1 IP和其他白色其他IP运行,但我认为端口是独立的。我使用这个功能,没有问题,但现在有问题,我无法接收到月经。

PD:并且任何想要改革帖子的非常多的经验或声誉都是免费的。 PD2:对不起,很长的帖子和非常多的编辑。 PD3:非常需要帮助,这个论坛是编程问题的最佳选择。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

在打开另一个套接字之前,您需要关闭套接字。 例如:

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);

答案 2 :(得分:0)

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

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

有几种可能的解决方法:

  1. 在不同的端口上有两个独立的程序。
  2. 可以轻松更改运行之间的端口。
  3. 如果正在使用原始端口,则自动更改端口。
  4. 我建议最后一个选项。如果捕获该错误,请尝试绑定到辅助端口。当您尝试发送数据包时,请将其发送到两个套接字。这是一个快速简便的解决方案。

答案 3 :(得分:0)

"地址已绑定异常",您只能在特定端口上运行一个套接字。由于发送方和接收方都在同一个程序中,您可以为发送方和接收方使用不同的端口并尝试使用它。