[英]Server echoing back using Datagram Sockets in java
我寫了一個叫做echo Server的程序,它有兩個文件,即發送者和接收者 。
發送方使用Datagram套接字和Datagram數據包發送數據,服務器(接收方)將同一件事回顯。
但是回顯的消息與發送的消息不同。
輸出不正確為什么會這樣?
發件人計划
import java.net.*;
import java.io.*;
public class sender {
public static void main(String[] args){
try{
DatagramSocket ds = new DatagramSocket();
InetAddress ip = InetAddress.getByName("localhost");
int port = 1234;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String msg = br.readLine();
byte[] buf = new byte[100];
while(true){
DatagramPacket dp = new DatagramPacket(msg.getBytes(),msg.length(),ip,port);
if(!msg.equals("quit"))
ds.send(dp);
else { ds.send(dp);break;}
dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
msg = new String(buf);
System.out.println(msg);
msg = br.readLine();
}
//ds.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
接收器(服務器)程序
import java.net.*;
import java.io.*;
public class receiver {
public static void main(String[] args){
try{
DatagramSocket ds = new DatagramSocket(1234);
DatagramSocket sds = new DatagramSocket();
byte[] buf = new byte[100];
String msg;
DatagramPacket rdp,sdp;
while(true)
{
rdp = new DatagramPacket(buf,buf.length);
ds.receive(rdp);
msg = new String(buf);
msg = msg.trim();
if(!msg.equals("quit"))
System.out.println(msg);
else break;
sdp = new DatagramPacket(msg.getBytes(),msg.length(),rdp.getAddress(),rdp.getPort());
sds.send(sdp);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
msg = new String(buf);
問題在這里。 您將忽略數據報中的長度。 它應該是:
msg = new String(rdp.getData(), rdp.getOffset(), rdp.getLength());
然后:
msg = msg.trim();
不用了 去掉。
byte[] buf = new byte[100];
僅創建一次,但之后從未清除。 因此,當下一條消息比上一條短時,將保留一部分舊數據,從而使兩端的數據都出錯。
嘗試在while循環開始時清除緩沖區。
while(true){
buf = new byte[100];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.