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次及以後似乎正常工作。
有什麼想法?
調試器顯示你什麼? – 2012-03-19 17:03:45
除此之外,由於您發佈的代碼與您所談論的內容不符......我不確定任何人都可以告訴您。 – 2012-03-19 17:10:01
您的代碼未打印出實際消息,第二個響應中的內容長度與打印消息的內容長度不符。不應該將第一個響應行寫成outToClient.println(「Message:」+ clientSentence);'? – 2012-03-19 17:10:27