簡體   English   中英

通過UDP套接字發送數據時出現問題

[英]Problem sending data over UDP sockets

這是我昨天提出的問題的后續措施。 我進行了一項家庭作業,以使用客戶端/服務器TCP套接字連接發送和接收數據。 我想使用UDP制作一個版本。 我的想法是,我可以重定向標准I / O並使用UDP發送流。 例如,如果我輸入:

 server: java UDPServer 5555 < file1.txt
 client: java UDPClient localhost 5555 > file2.txt

它應該將file1.txt中的數據從服務器發送到客戶端的file2.txt。 當我在單獨的終端中運行客戶機/服務器對時,將創建file2.txt,但實際上不會發送數據。 相反,似乎我陷入了無限循環,除非殺死應用程序,否則無法在終端中輸入任何內容。

服務器代碼為:

public static final int BUF_SIZE = 256;

public static void main(String[] args) throws IOException{

    port = Integer.parseInt(args[0]);

    DatagramSocket serverSocket = new DatagramSocket(port);

    BufferedInputStream input = new BufferedInputStream(System.in);
    BufferedOutputStream output = new BufferedOutputStream(System.out);

    byte[] receiveData = new byte[BUF_SIZE];
    byte[] sendData = new byte[BUF_SIZE];
    byte[] buf = new byte[BUF_SIZE];
    String sentence;

    if(System.in.available() > 0) {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        InetAddress address = receivePacket.getAddress();
        int bytesRead = 0;
        while((bytesRead = input.read(buf, 0, BUF_SIZE)) != -1) {
            sentence = new String(buf, 0, bytesRead);
            sendData = sentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
            serverSocket.send(sendPacket);
        }
    } else {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        sentence = new String(receivePacket.getData());
        output.write(sentence.getBytes());
    }

    serverSocket.close();
    input.close();
    output.close();
}

客戶端代碼為:

public static final int BUF_SIZE = 256;

public static void main(String[] args) throws IOException{

    String hostName = args[0];
    port = Integer.parseInt(args[1]);

    DatagramSocket clientSocket = new DatagramSocket();
    InetAddress address = InetAddress.getByName(hostName);

    BufferedInputStream input = new BufferedInputStream(System.in);
    BufferedOutputStream output = new BufferedOutputStream(System.out);

    byte[] sendData = new byte[BUF_SIZE];
    byte[] receiveData = new byte[BUF_SIZE];
    byte[] buf = new byte[BUF_SIZE];
    String sentence;

    if(System.in.available() > 0) {
        int bytesRead = 0;
        while((bytesRead = input.read(buf, 0, BUF_SIZE)) != -1) {
            sentence = new String(buf, 0, bytesRead);
            sendData = sentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
            clientSocket.send(sendPacket);
        }
    } else {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        sentence = new String(receivePacket.getData());
        output.write(sentence.getBytes());
    }

    clientSocket.close();
    input.close();
    output.close();
}

我還是套接字編程的新手,所以我將其基於我的教科書中的示例代碼。 我是否犯了一些明顯的錯誤,即阻止了數據傳輸? 非常感謝您的耐心配合和幫助!

您遇到的第一個問題是,由於您的shell命令錯誤, client.main無法運行。 由於某種原因,使用Java不能將輸出重定向到傳統方式。 您可以簡單地在client.main的開頭放置一些打印語句,以查看沒有任何執行。 嘗試這個:

java UDPClient localhost 5555 | tee file2.txt

請參閱重定向Java輸出

您遇到的另一個問題是客戶端和服務器都在等待接收數據報。 您在服務器代碼中有:

if(System.in.available() > 0) {
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);

並且您在客戶端代碼中:

else {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        sentence = new String(receivePacket.getData());
        output.write(sentence.getBytes());
        }

請注意,else語句將始終執行,因為System.in.available將始終返回0。請記住,您沒有將輸入重定向到客戶端,因此System.in中沒有任何內容。 要解決此問題,您需要首先發送客戶端數據報,以便服務器可以使用file2.txt的內容進行響應

您錯過了完成這項工作所需要做的所有事情。 傳輸步調,重傳,確認,重新排序等的代碼在哪里? 如果要使用UDP,則必須自己完成TCP為您做的所有事情。

有關在UDP之上分層的文件傳輸協議的示例,請參見RFC 1350

暫無
暫無

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

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