【问题标题】:Problem sending data over UDP sockets通过 UDP 套接字发送数据时出现问题
【发布时间】:2011-09-15 17:42:26
【问题描述】:

这是对我昨天提出的问题的一种跟进。我有一项家庭作业是使用客户端/服务器 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();
}

我仍然是套接字编程的新手,所以我基于我教科书中的示例代码。我是否犯了一些明显的错误,导致数据无法传输?非常感谢您的耐心和帮助!

【问题讨论】:

    标签: java sockets udp


    【解决方案1】:

    您遇到的第一个问题是 client.main 没有运行,因为您的 shell 命令错误。出于某种原因,使用 Java,您无法按照传统方式重定向输出。您可以简单地在 client.main 的开头放置一些打印语句来查看没有执行任何操作。试试这个:

    java UDPClient localhost 5555 | tee file2.txt
    

    redirect Java output

    您遇到的另一个问题是客户端和服务器都在等待接收数据报。您在服务器代码中有:

    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 的内容。

    【讨论】:

      【解决方案2】:

      您错过了完成这项工作所需要做的所有事情。执行传输调步、重传、确认、重新排序等的代码在哪里?如果你想使用 UDP,你必须自己做所有 TCP 为你做的事情。

      请参阅 RFC 1350 示例,了解在 UDP 之上分层的文件传输协议的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多