服务器在 java 中使用数据报套接字回显
Server echoing back using Datagram Sockets in java
我写的这个程序叫做 echo Server.It 有两个文件,即 sender
接收方。
发送方使用数据报套接字和数据报包发送数据,并且服务器(接收方)回显相同的内容。
但是回显的消息与发送的消息不同。
输出不是proper.Why是否发生这种情况?
发件人程序
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();
}
}
}
byte[] buf = new byte[100];
创建了一次,之后就再也没有清除过。因此,当下一条消息比上一条消息短时,旧数据的一部分仍然存在,因此您在两端都会得到错误的数据。
尝试在 while 循环开始时清除缓冲区。
while(true){
buf = new byte[100];
msg = new String(buf);
问题就在这里。您忽略了数据报中的长度。应该是:
msg = new String(rdp.getData(), rdp.getOffset(), rdp.getLength());
然后:
msg = msg.trim();
你不需要那个。移除。
我写的这个程序叫做 echo Server.It 有两个文件,即 sender
接收方。
发送方使用数据报套接字和数据报包发送数据,并且服务器(接收方)回显相同的内容。
但是回显的消息与发送的消息不同。
输出不是proper.Why是否发生这种情况?
发件人程序
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();
}
}
}
byte[] buf = new byte[100];
创建了一次,之后就再也没有清除过。因此,当下一条消息比上一条消息短时,旧数据的一部分仍然存在,因此您在两端都会得到错误的数据。
尝试在 while 循环开始时清除缓冲区。
while(true){
buf = new byte[100];
msg = new String(buf);
问题就在这里。您忽略了数据报中的长度。应该是:
msg = new String(rdp.getData(), rdp.getOffset(), rdp.getLength());
然后:
msg = msg.trim();
你不需要那个。移除。