как отправить int через UDP в java
Я пытаюсь написать немного кода, который отправляет один int через UDP. Код у меня пока есть:
отправитель:
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 ответов
используйте потоки данных, такие как:
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);
}
}
InputStream.read() возвращает один байт, а не 32-разрядное целое число (см. javadoc). Так что вы хотите
ObjectInputStream os = new ObjectInputStream(bin);
os.readInt();
проблема в том, что вы получаете код CHAR '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 будет работать лучше для вас, я думаю.