有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中通过UDP发送int

我正在尝试编写一段代码,通过UDP发送一个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”,这显然是不对的。我认为问题可能是我以字符串或其他形式发送它,而它没有正确地读取它。有什么帮助吗


共 (3) 个答案

  1. # 1 楼答案

    使用数据流,如:

    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 = byteOut.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. # 2 楼答案

    输入流。read()返回单个字节,而不是32位整数(请参阅javadoc)。所以你想要的是

    ObjectInputStream os = new ObjectInputStream(bin);
    os.readInt();
    
  3. # 3 楼答案

    问题是您接收到的字符代码是“2”,而不是整数形式的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解决方案对您来说会更好