"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);
您一次只能将一个套接字绑定到一个端口。
由于您在本地 运行 程序两次,所以两个套接字都试图绑定到同一个端口。
有几个可能的修复方法:
- 在不同的端口上有两个独立的程序。
- 有一种在运行之间更改端口的简单方法。
- 如果原始端口正在使用,则自动更改端口。
我建议最后一个选项。如果发现该错误,请尝试绑定到辅助端口。当您尝试发送数据包时,将其发送到两个套接字。那将是一个快速简单的解决方案。
问题出在你的端口上。检查您的服务器代码端口。如果在同一系统上有两个服务器 运行,当端口号相同时,第二个服务器将永远不会启动,因为它已被第一个服务器使用。
解决方法:在两个Server中使用两个不同的端口号。例如,第一个服务器程序为 7070,第二个服务器程序为 7080。
"Address already bind exception",您只能在特定端口上创建一个到 运行 的套接字。由于发送方和接收方都在同一个程序中,您可以为发送方和接收方使用不同的端口并尝试一下。
我有一个问题(很明显)。我是 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);
您一次只能将一个套接字绑定到一个端口。
由于您在本地 运行 程序两次,所以两个套接字都试图绑定到同一个端口。
有几个可能的修复方法:
- 在不同的端口上有两个独立的程序。
- 有一种在运行之间更改端口的简单方法。
- 如果原始端口正在使用,则自动更改端口。
我建议最后一个选项。如果发现该错误,请尝试绑定到辅助端口。当您尝试发送数据包时,将其发送到两个套接字。那将是一个快速简单的解决方案。
问题出在你的端口上。检查您的服务器代码端口。如果在同一系统上有两个服务器 运行,当端口号相同时,第二个服务器将永远不会启动,因为它已被第一个服务器使用。
解决方法:在两个Server中使用两个不同的端口号。例如,第一个服务器程序为 7070,第二个服务器程序为 7080。
"Address already bind exception",您只能在特定端口上创建一个到 运行 的套接字。由于发送方和接收方都在同一个程序中,您可以为发送方和接收方使用不同的端口并尝试一下。