使用std libs实现Java TFTP - 如何获取ack数据包?

时间:2012-03-20 01:25:54

标签: java sockets network-programming

我试图实现TFTP客户端/服务器。根据RFC 1350我得到的一切正确,现在唯一缺少的是确认接收它的人收到的每个数据包是客户端还是服务器。

  1. 服务器发送数据报包
  2. 客户端收到数据报包并在数据包中发回ACK(“confirm”)msg
  3. 服务器发送下一个数据包
  4. 如果客户端在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();
    

    我正在学习网络编程,所以感谢任何建议或代码示例。

2 个答案:

答案 0 :(得分:1)

问题解决了:

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

答案 1 :(得分:0)

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

  2. 发送。