簡體   English   中英

服務器在Java中使用數據報套接字回顯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM