2012-03-20 58 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()如果它是發送下一個或再次傳送相同的一個