2012-04-09 9 views
6
diff diff

En mi aplicación, he creado un socket de datagarm y enlacé un puerto digamos 9999 a ip 192.168.173.1 ahora quiero vincular el puerto a una nueva ip, digamos 192.168.173.2 pero no soy capaz de hacerlo pasos que hemos seguidoVuelva a vincular un puerto al socket de datagrama en un IP

1 DatagramSocket s= new DatagramSocket(port,ip1); 
2 s.disconnect(); 

s.close(); 

s= new DatagramSocket(port,ip2); 

pero esto le da un

java,net,BindException :Address already in use : Cannot bind 

Cualquier penetración sería muy útil.

+0

Ha comprobado lo siguiente: 1. el puerto 9999 es gratuito en IP2, 2. IP2 es activable 3. tiene permisos para acceder a IP2. – NiranjanBhat

Respuesta

7

Para evitar excepciones al intentar desvincular y volver a enlazar, configuraría cada socket creado como reutilizable. Con el fin de hacerlo, debe crear una toma de no unido:

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(someSocketAddress); 

Más información: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean)

P. S. El período de tiempo de espera que es la razón principal de una excepción BindException en tales circunstancias cuando se usa un TCP puede no aplicarse a los sockets UDP, pero el SO_REUSE debería permitirle volver a enlazar instantáneamente de todos modos. http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean)

Éstos son algunos ejemplos:

final int port = 55880; 

a) no reutilización, no cerrar = Dirección ya en uso

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

B) Reciclar, sin cerrar = ninguna queja

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

C) Sin reutilización, cerrar = sin quejas (para conectores de datagrama o nly)

+0

No funcionó Establecí la reutilización de socket como verdadera, pero la misma excepción vuelve a aparecer – cornercoder

+0

Si todos los sockets que se unen en ese puerto específico son reutilizables, no puede obtener una excepción de enlace. – afk5min

+0

solo hay un puerto y obtengo una excepción – cornercoder

Cuestiones relacionadas