2011-03-08 48 views
6

我在尝试编写一些通过UDP发送单个int的代码。该代码我到目前为止有:如何在java中通过UDP发送int int

发件人:

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); 

接收机:

 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); 

的问题是接收器打印 '50' 到屏幕这显然是不对的。我认为问题可能是我以某种方式将它作为字符串或其他东西发送,而不是正确读取它。任何帮助?

回答

8

使用数据流,如:

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()返回单个字节,而不是32位整数(请参阅javadoc)。所以你想要的是

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

问题是,你正在接收'2'的CHAR CODE而不是acctual 2作为整数。尝试更改您的接收器代码为:

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

    socket.receive(packet); 

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

但是ObjectInputStream解决方案对您我会更好。