簡體   English   中英

用Java清除數據報緩沖區

[英]Clear Datagram Buffer in Java

所以我從互聯網上獲得了這個簡單的udp客戶端/服務器代碼,並且它有效。 但是,當我輸入比我之前輸入的東西更短的東西時,我會剩下剩下的字符。 例如,如果我先輸入:

kitty

然后輸入:

cat

第二個印刷品如下:

catty

我一直在尋找其他有類似問題的人,其中大部分似乎都是通過清除字節數組來解決的。 但是,如果我嘗試實現他們的答案,它不能解決我的問題。 我需要做什么,並且(可能更重要的是)代碼應該去哪里? 這是代碼:

客戶:

import java.io.*;
import java.net.*;

class UDPClient
 {
    public static void main(String args[]) throws Exception
    {
       BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
       DatagramSocket clientSocket = new DatagramSocket();
       InetAddress IPAddress = InetAddress.getByName("localhost");
       byte[] sendData = new byte[1024];
       byte[] receiveData = new byte[1024];
       String sentence = inFromUser.readLine();
       sendData = sentence.getBytes();
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 20700);
       clientSocket.send(sendPacket);
       DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
       clientSocket.receive(receivePacket);
       String modifiedSentence = new String(receivePacket.getData());
       System.out.println("FROM SERVER:" + modifiedSentence);
       clientSocket.close();
    }
 }

服務器:

import java.io.*;
import java.net.*;
import java.util.*;

class UDPServer
 {
    public static void main(String args[]) throws Exception
       {
          DatagramSocket serverSocket = new DatagramSocket(21200);
          byte[] receiveData = new byte[1024];
          byte[] sendData = new byte[1024];
          while(true)
                {
                   DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                   serverSocket.receive(receivePacket);
                   String sentence = new String( receivePacket.getData(), 0, receivePacket.getLength());
                   System.out.println("RECEIVED: " + sentence);
                   InetAddress IPAddress = receivePacket.getAddress();
                   int port = receivePacket.getPort();
                   String capitalizedSentence = sentence.toUpperCase();
                   sendData = capitalizedSentence.getBytes();
                   DatagramPacket sendPacket =  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                   serverSocket.send(sendPacket);
                }
       }
 }

您不需要清除字節數組,但是您需要通過getLength()方法在接收之后注意DatagramPacket的長度; 例如:

new String(packet.getData(), packet.getOffset(), packet.getLength());

您在服務器中正確地執行了此操作,但在客戶端中卻沒有。

您還需要在調用receive()之前重置長度。 否則, DatagramPacket將繼續縮小到目前為止收到的最小數據包的長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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