【问题标题】:Java TFTP implementation with std libs - how to ack packets?带有标准库的 Java TFTP 实现 - 如何确认数据包?
【发布时间】:2012-03-20 01:25:53
【问题描述】:

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

  1. 服务器发送数据报包
  2. 客户端收到数据报包,并在包中发回 ACK(“确认”)消息
  3. 服务器发送下一个数据包

如果客户端在 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();

我刚刚学习网络编程,如果有任何建议或代码示例,我将不胜感激。

【问题讨论】:

    标签: java sockets network-programming


    【解决方案1】:

    问题解决了:

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

    【讨论】:

      【解决方案2】:
      1. 将所需数据构建到 DatagramPacket 中。由于这是回复,最好重用传入的DatagramPacket。这样它就已经有了目标地址。

      2. 发送。

      【讨论】:

      • 没有。您需要的 API 是 DatagramPacket.setData()DatagramSocket.send()
      • 我在这里呆了 2 天,我什么也没得到。无论如何感谢您的帮助。我试图实现你所说的我重写了我的方法但没有走远:copypastecode.com/187840
      • 我看不出您在该代码中的哪些地方采纳了我的任何建议,因此即使向我展示也没有意义。
      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多