2010-06-01 19 views
6

Mañana.Transmisión UDP en Java

Soy bastante nuevo en las conexiones de Java y de socket, pero estoy tratando de enviar un paquete UDP/broadcast en 255.255.255.255 en el puerto 8001 a un dispositivo. Puedo hacer que los datos se envíen correctamente, sin embargo, cuando llega el momento de recibir los datos, la conexión expira. Tengo un detector de paquetes y puedo ver el paquete enviar y luego el dispositivo responde.

Estoy bastante seguro de que es un error de novato que me falta en mi código pero he estado atascado en él por un tiempo y cualquier ayuda sería apreciada.

m_Socket = new DatagramSocket(m_SERVERPORT); 
InetAddress address = InetAddress.getByName(m_SERVERIP); 


m_DataPack = new DatagramPacket(m_SERVERCMD.getBytes(), m_SERVERCMD.getBytes().length, 
address, m_SERVERPORT); 
m_Socket.setBroadcast(true); 
m_Socket.connect(address, m_SERVERPORT); 

m_Socket.send(m_DataPack); 
m_DataPack = new DatagramPacket(data, data.length, 
address, m_SERVERPORT); 


m_Socket.receive(m_DataPack); // This is where it times out 


data = m_DataPack.getData(); 
String received = data.toString(); 
System.out.println("Received: " + received); 
m_Socket.close(); 

Gracias y Gig'Em.

EDIT:

No estoy seguro de si esto ayuda, pero cuando veo el objeto m_Socket puedo ver la siguiente justo antes de que envía:

bound = true; 
close = false; 
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1); 
connectedPort = 8001; 
connectState = 1; 
created = true; 
impl = PlainDatagramSocketImpl; 
oldImpl = false; 

y el objeto m_DataPack es la siguiente:

address = Inet4Address (id = 32) (-1,-1,-1,-1); 
bufLength = 6 (size of packet I'm sending is 6 char long); 
offset = 0; 
port = 8001; 
+0

Te das cuenta de que tu Gig'Em aliena a algunos graduados de uno de los programas de CS más grandes de América, ¿verdad? – jasonmp85

+0

@ jasonmp85 para aquellos que no son texanos que se preguntan qué significa: https://en.wikipedia.org/wiki/Traditions_of_Texas_A%26M_University#Gig_.27em (sí, tuve que buscarlo;)) – Matthieu

Respuesta

1

Si desea recibir un datagrama que necesita para bind() al extremo local (dirección + puerto).

+0

En el enlace función Necesito establecer el punto final local a una dirección y puerto a través de SocketAddress. ¿Cuál es la mejor manera de hacer esto? Sé en la clase DatagramPacket que hay una getSocketAddress(); funciona así que eso no me ayuda. – user355528

+0

Probé m_DataPack = new DatagramPacket (data, data.length, InetAddress.getLocalHost(), m_SERVERPORT); y luego m_Socket.bind (m_DataPack.getSocketAddress()); pero arroja una excepción diciendo que el socket ya ha sido vinculado. – user355528

+0

Él es vinculante, eso es lo que hace el nuevo DatagramSocket (int port). – EJP

10

Esto no tiene sentido. Estás transmitiendo, que es de 1 a muchos, y también te estás conectando, que es de 1 a 1. ¿Cuál es?

Pierde la conexión. Y pierde el 255.255.255.255. Esto ha sido muy obsoleto durante aproximadamente 20 años. Use una dirección de difusión local de subred, p. 192.168.1.255.