[英]Socket Programming java using datagram multiple packets
我正在嘗試制作一個客戶端服務器程序。 在客戶端,我從用戶那里得到多個輸入,我必須將其傳遞給服務器。 服務器使用該信息並進行一些計算,然后將結果發送回去。 客戶代碼中的重要部分:
private byte[] buf = new byte[256];
private byte[] buf2 = new byte[256];
private byte[] buf3 = new byte[256];
while (true) {
Arrays.fill(buf, (byte) 0);
buf = jTextField1.getText().trim().getBytes();
sendPacket = new DatagramPacket(buf, buf.length, address, 8000);
socket.send(sendPacket);
buf2 = jTextField2.getText().trim().getBytes();
sendPacket = new DatagramPacket(buf2, buf2.length, address, 8000);
socket.send(sendPacket);
buf3 = jTextField3.getText().trim().getBytes();
sendPacket = new DatagramPacket(buf3, buf3.length, address, 8000);
socket.send(sendPacket);
//Get result from Server
socket.receive(recivePacket);
double result = Double.parseDouble(new String(buf).trim());
System.out.println("Result" +result);
}
在服務器端,我正在嘗試接收數據(不起作用)
byte[] buf = new byte[256];
DatagramPacket recivePacket = new DatagramPacket(buf, buf.length);
DatagramPacket dgp = new DatagramPacket(buf, buf.length);
while (true) {
Arrays.fill(buf, (byte) 0);
serverSocket.receive(recivePacket);
System.out.println("host Name is " +
recivePacket.getAddress().getHostName() + '\n');
while (true) {
serverSocket.receive(dgp);
System.out.println("String=====" + new String(buf));
}
請幫我在這里。 這段代碼有什么問題...我完全被卡住了,所以奇怪的是,有時它起作用了。 但這給了我最后一個緩沖的價值。 其他值將丟失。 提前致謝
因此,我認為每次在服務器上接收到某些內容時,都需要為此創建一個新的DatagramPacket / byte []。 每當我收到這樣的消息時,我要做的就是創建一個新的DatagramPacket:
DatagramPacket packet = new DatagramPacket(new byte[max_data_size], max_data_size);
socket.receive(packet);
我的max_data_size is normally around 1024 bits
。
然后,您可以閱讀諸如客戶端,端口,長度等內容:
InetAddress address = packet.getAddress();
int port = packet.getPort();
int len = packet.getLength();
byte[] data = packet.getData();
通常,您應該能夠簡單地將新的datagramPacket發送回給定的InetAddress /端口。
您要用戶提供多個輸入嗎? 將所有東西打包在一個包裝中。
private YourClass newInstance(byte[] bytes){
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInput in = null;
YourClass o = null;
try {
in = new ObjectInputStream(bis);
o = (YourClass)in.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (ClassCastException e){
e.printStackTrace();
}finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
// ignore close exception
}
}
return o;
}
private byte[] toBytes(YourClass object){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
byte[] bytes = new byte[1];
try {
out = new ObjectOutputStream(bos);
object.setTimestamp(System.currentTimeMillis());
out.writeObject(object);
out.flush();
bytes = bos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bos.close();
} catch (IOException ex) {
// ignore close exception
}
}
return bytes;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.