Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用std libs实现Java TFTP-如何确认数据包?_Java_Sockets_Network Programming - Fatal编程技术网

使用std libs实现Java TFTP-如何确认数据包?

使用std libs实现Java TFTP-如何确认数据包?,java,sockets,network-programming,Java,Sockets,Network Programming,我尝试实现一个TFTP客户机/服务器。根据RFC1350,我做的一切都是对的,现在唯一缺少的是确认接收数据包的人收到的每个数据包,无论是客户端还是服务器 服务器发送一个数据报包 客户端接收数据报数据包并在数据包中发回ACK(“确认”)消息 服务器发送下一个数据包 若客户端在20秒内并没有发送ACK,那个么服务器将再次传输相同的数据包,直到它从客户端接收到ACK为止 这是我发送和接收数据包的方法。它们都可以工作,我只需要添加上面的内容,但我完全不知道如何实现它 服务器: private void

我尝试实现一个TFTP客户机/服务器。根据RFC1350,我做的一切都是对的,现在唯一缺少的是确认接收数据包的人收到的每个数据包,无论是客户端还是服务器

  • 服务器发送一个数据报包
  • 客户端接收数据报数据包并在数据包中发回ACK(“确认”)消息
  • 服务器发送下一个数据包
  • 若客户端在20秒内并没有发送ACK,那个么服务器将再次传输相同的数据包,直到它从客户端接收到ACK为止

    这是我发送和接收数据包的方法。它们都可以工作,我只需要添加上面的内容,但我完全不知道如何实现它

    服务器:

    private void receiveData() throws Exception
    {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat prefix = new SimpleDateFormat(date_format);
        String date = prefix.format(cal.getTime()).toString();
    
        DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length);
        OutputStream fos = new FileOutputStream(new File(date+data));
    
        while(true)
        {
            clientSocket.receive(receiveData);
            if(receiveData.getLength() == 512)
            {
                fos.write(receiveData.getData());
            } else {
                fos.write(receiveData.getData(), receiveData.getOffset(), receiveData.getLength());
                break;
            }
        }
        fos.close();
        clientSocket.close();
    }
    
    客户:

        private void sendData() throws Exception {
        DatagramPacket data = new DatagramPacket(outgoingData,
                outgoingData.length, clientAddress, clientPort);
        InputStream fis = new FileInputStream(responseData);
    
        int a;
        while ((a = fis.read(outgoingData, 0, 512)) != -1) {
            data.setLength(a);
            serverSocket.send(data);
            Thread.sleep(5);
        }
        fis.close();
    
    我只是在学习网络编程,所以如果有任何建议或代码示例,我将不胜感激

  • 将所需数据构建到
    数据包中。由于这是一个回复,因此最好重用传入的
    DatagramPacket
    。这样它就已经有了目标地址

  • 发送它

  • 解决的问题:

  • sendData()发送一个数据包
  • receiveData()获取数据包并将其发回
  • sendData()检查数据包是否与发送的数据包相同
  • sendData()如果是,则发送下一个或再次传输同一个

  • 不需要。您需要的API是
    DatagramPacket.setData()
    DatagramSocket.send()
    。我已经做了两天了,什么都没有得到。无论如何谢谢你的帮助。我试着实现你所说的,我重写了我的方法,但没有成功:我看不出你在代码中采纳了我的任何建议,所以甚至向我展示它都没有意义。