6

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」を印刷していることですが、これは明らかに正しくありません。問題は、どういうわけか文字列などで送信していて、正しく読み取れないことだと思います。何か助けはありますか?

4

3 に答える 3

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

}

于 2011-03-08T18:49:44.027 に答える
2

InputStream.read()は、32ビット整数ではなく1バイトを返します(javadocを参照)。だからあなたが欲しいのは

ObjectInputStream os = new ObjectInputStream(bin);
os.readInt();
于 2011-03-08T18:29:42.587 に答える
1

問題は、整数として実際の2ではなく、「2」のCHARCODEを受け取っていることです。レシーバーコードを次のように変更してみてください。

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

    socket.receive(packet);

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

しかし、ObjectInputStreamソリューションの方がうまくいくと思います。

于 2011-03-08T18:34:14.987 に答える