2011-03-08 47 views
6

Estoy tratando de escribir un poco de código que envía una sola int sobre UDP. El código que tengo hasta ahora:cómo enviar un int a través de UDP en Java

remitente:

int num = 2; 

DatagramSocket socket = new DatagramSocket(); 
ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
PrintStream pout = new PrintStream(bout); 
pout.print(num); 
byte[] barray = bout.toByteArray(); 
DatagramPacket packet = new DatagramPacket(barray, barray.length); 
InetAddress remote_addr = InetAddress.getByName("localhost");   
packet.setAddress(remote_addr); 
packet.setPort(1989); 
socket.send(packet); 

receptor:

 DatagramSocket socket = new DatagramSocket(1989); 
     DatagramPacket packet = new DatagramPacket(new byte[256] , 256); 

     socket.receive(packet); 

     ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData()); 

     for (int i=0; i< packet.getLength(); i++) 
     { 
     int data = bin.read(); 
     if(data == -1) 
     break; 
     else 
     System.out.print((int) data); 

El problema es que el receptor está imprimiendo '50' a la pantalla que, evidentemente, no está bien. Creo que el problema puede ser que de alguna manera estoy enviándolo como una cadena o algo así y no lo estoy leyendo bien. ¿Alguna ayuda?

Respuesta

8

Uso flujos de datos como:

import java.io.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     final ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
     final DataOutputStream dataOut = new DataOutputStream(byteOut); 
     dataOut.writeInt(1); 
     dataOut.writeDouble(1.2); 
     dataOut.writeLong(4l); 
     dataOut.close(); // or dataOut.flush() 
     final byte[] bytes = byteOutStream.toByteArray(); 
     final ByteArrayInputStream byteIn = new ByteArrayInputStream(bytes); 
     final DataInputStream dataIn = new DataInputStream(byteIn); 
     final int integ = dataIn.readInt(); 
     final double doub = dataIn.readDouble(); 
     final long lon = dataIn.readLong(); 
     System.out.println(integ); 
     System.out.println(doub); 
     System.out.println(lon); 
    } 

}

2

InputStream.read() devuelve un solo byte, no un entero de 32 bits (ver javadoc). Entonces lo que quiere es

ObjectInputStream os = new ObjectInputStream(bin); 
os.readInt(); 
1

El problema es que usted está recibiendo CHAR CODE de '2' y no acctual 2 como número entero. Intente cambiar el código de su receptor a:

DatagramSocket socket = new DatagramSocket(1989); 
    DatagramPacket packet = new DatagramPacket(new byte[256] , 256); 

    socket.receive(packet); 

    System.out.print(new String(packet.getData())); 

Pero la solución ObjectInputStream funcionaría mejor para usted, supongo.

Cuestiones relacionadas