我有一个问题(显然)。我在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:非常需要帮助,这个论坛是编程问题的最佳选择。答案 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)
您一次只能将一个套接字绑定到一个端口。
由于您在本地运行程序两次,因此两个套接字都试图绑定到同一个端口。
有几种可能的解决方法:
我建议最后一个选项。如果捕获该错误,请尝试绑定到辅助端口。当您尝试发送数据包时,请将其发送到两个套接字。这是一个快速简便的解决方案。
答案 3 :(得分:0)
"地址已绑定异常",您只能在特定端口上运行一个套接字。由于发送方和接收方都在同一个程序中,您可以为发送方和接收方使用不同的端口并尝试使用它。