2012-03-19 19 views
0

用戶選擇一個選項,在本例中爲選項1 - Brew。然後他們輸入URL,在這種情況下是BREW。我現在只檢查BREW這個詞,所以在這個階段coffee:// 127 ...是無關緊要的。第二遍Java中的不規則輸出

從服務器接收到消息響應。注意在第一個服務器響應消息中發送200 OK。

應用程序繼續循環,用戶再次輸入URL,同樣是BREW。

這次的問題是400返回錯誤的請求消息。由於URL是正確的,他們應該會收到200 OK,就像應用程序的第一遍一樣。

客戶端控制檯:

WELCOME TO THE COFFEE POT APPLICATION! 

Select an option: 
1. Brew 
2. Quit 
1 
Enter URL (e.g. BREW coffee://127.0.0.1/pot-1 HTCPCP-new) 
BREW 

MESSAGE FROM SERVER: 
    Message: BREW Accept-Additions: *, *, *, *, *, *, *, 
    HTCPCP-new 200 OK BREW START command completed. 
    Content-length: 44 
    Content-type: application/octet-stream 
    @@ 

Select an option: 
1. Brew 
2. Quit 
1 
Enter URL (e.g. BREW coffee://127.0.0.1/pot-1 HTCPCP-new) 
BREW 

MESSAGE FROM SERVER: 
    Message: BREW Accept-Additions: *, *, *, *, *, *, *, 
    HTCPCP-new 400 Bad Request. 
    Content-length: 5 
    Content-type: application/octet-stream 
    @@ 

Select an option: 
1. Brew 
2. Quit 

客戶端線程處理器:

import java.io.*; 
import java.net.*; 
import javax.activation.MimetypesFileTypeMap; 

public class HTCPCPClientWorker extends Thread { 

    Socket cwsocket = null; 

    public HTCPCPClientWorker(Socket cwsocket) { 
     super("ClientWorker"); 
     this.cwsocket = cwsocket; 
    } 

    @Override 
    public void run() { 

     String clientSentence = null; 
     BufferedReader inFromClient = null; 
     PrintWriter outToClient = null; 

     try { 
      inFromClient = new BufferedReader(new InputStreamReader(cwsocket.getInputStream())); 
      outToClient = new PrintWriter(cwsocket.getOutputStream(), true); 
     } catch (IOException ex) { 
      System.err.println("Cannot create streams"); 
     } 

     try { 

      do { // end when client says QUIT 

       StringBuffer clientInputLine[] = new StringBuffer[3]; 

       clientInputLine[0] = new StringBuffer(); 
       clientInputLine[1] = new StringBuffer(); 

       // Get next message from client 
       for (int i = 0; i <= clientInputLine.length; i++) { 

        // read input line from BufferedReader 
        clientSentence = inFromClient.readLine(); 

        if (clientSentence.contains("BREW")) { 
         outToClient.println("Message: " + clientSentence); 
         outToClient.println("HTCPCP-new 200 OK BREW START command completed."); 
         outToClient.println("Content-length: " + clientSentence.length()); // length needs to correspond to above line 
         outToClient.println("Content-type: " + new MimetypesFileTypeMap().getContentType(clientSentence)); 
         outToClient.println("@@"); 
         outToClient.flush(); 
        } else { 
         outToClient.println("Message: " + clientSentence); 
         outToClient.println("HTCPCP-new 400 Bad Request."); 
         outToClient.println("Content-length: " + clientSentence.length()); // length needs to correspond to above line 
         outToClient.println("Content-type: " + new MimetypesFileTypeMap().getContentType(clientSentence)); 
         outToClient.println("@@"); 
         outToClient.flush(); 
        } 

        // wait for EOF = @@ 
        System.out.println("\tInput: " + clientSentence); 
        if (clientSentence.equals("@@") == true) { 
         break; 
        } 
        clientInputLine[i].append(clientSentence); 
       } // end for loop 


      } while (!clientSentence.contains("QUIT")); 

      outToClient.println("GOODBYE!"); 
      outToClient.flush(); 

      System.out.println("\tClient has disconnected."); 
      cwsocket.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } // end run 

} // end HTCPCPClientWorker.java 

我想這個問題將通過在每個通重建StringBuffer的予以糾正,但這似乎並不如此。

第3次及以後似乎正常工作。

有什麼想法?

+0

調試器顯示你什麼? – 2012-03-19 17:03:45

+0

除此之外,由於您發佈的代碼與您所談論的內容不符......我不確定任何人都可以告訴您。 – 2012-03-19 17:10:01

+0

您的代碼未打印出實際消息,第二個響應中的內容長度與打印消息的內容長度不符。不應該將第一個響應行寫成outToClient.println(「Message:」+ clientSentence);'? – 2012-03-19 17:10:27

回答

0

我相信你應該重新創建BufferedReader(inFromClient)每次你想從套接字讀取。在使用readLine之後,BufferedReader會變空,所以下一次您將輸入放在套接字上時,他不會讀取它。

還有更多關於讀寫套接字的信息here