服务器使用java中的数据报套接字回显

时间:2016-11-16 11:48:03

标签: java sockets udp datagram

我写了这个名为echo Server的程序。它有两个文件,即发件人接收器
发件人使用数据报套接字数据报包发送数据,服务器(接收者)回复相同的事情。
但回复的信息与发送的信息不一样。
输出不正确。为什么会发生这种情况?

发件人计划

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

enter image description here

2 个答案:

答案 0 :(得分:1)

msg = new String(buf);

问题出在这里。你忽略了数据报中的长度。它应该是:

msg = new String(rdp.getData(), rdp.getOffset(), rdp.getLength());

然后:

msg = msg.trim();

你不需要那个。删除。

答案 1 :(得分:0)

byte[] buf = new byte[100];

创建一次,但之后从未清除过。因此,当下一条消息比前一条消息短时,旧数据的一部分仍然存在,从而导致两端都出现错误数据。

尝试在while循环开始时清除缓冲区。

while(true){
    buf = new byte[100];