2012-03-20 18 views
0

我试图实现一个TFTP客户端/服务器。根据RFC 1350,我得到了正确的东西,现在唯一缺少的东西是确认每个接收它的数据包,无论是接收它的客户端还是服务器。使用std libs实现Java TFTP - 如何确认数据包?

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

如果客户端不发送确认20秒后,服务器再次转发相同的数据包,直到它从客户端收到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(); 

我刚学习网络编程,以便将感谢任何建议或代码示例。

回答

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

  2. 发送它。

+0

你可以在我的代码 – 2012-03-20 01:33:11

+0

上显示一个例子。你需要的API是'DatagramPacket.setData()'和'DatagramSocket.send()'。 – EJP 2012-03-20 01:41:42

+0

我在这里呆了2天,我什么也没得到。无论如何感谢您的帮助。我试图实现你所说的我重写我的方法,但没有得到多远:http://www.copypastecode.com/187840/ – 2012-03-20 01:59:27

1

问题解决了:

  1. 的SendData()发送的分组
  2. receiveData的()得到的数据包并将其发送回
  3. 的SendData()检查该分组是否一样的发送的一个
  4. sendData()如果它是发送下一个或再次传送相同的一个