TCP程式相關問題

修改下列程式碼

import java.io.*;

import java.net.*;

class TCPServer {

public static void main(String argv[]) throws Exception {

String clientSentence;

String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789);

while(true) {

Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

capitalizedSentence = clientSentence.toUpperCase() + '\n';

outToClient.writeBytes(capitalizedSentence);

}

}

}

題目如下:

建立一個會接收用戶端輸入的多行資料,並且將這些資料印出在其標準輸出上的伺服器。

請在其他任一台有網頁瀏覽器的電腦上,將瀏覽器的代理伺服器設定為正在執行你的伺服器端程式的主機,同時請洽當的設定埠號。

你的瀏覽器現在應該會將其GET請求訊息送給你的伺服器,而你的伺服器則應該會將這些訊息印出在他的標準輸出。

請使用這個平台來判斷你的瀏覽器是否會為了本機所快取的物件,產生條件式的GET訊息。

希望大家可以講解一下題目的意思,還有可以把程式詳細如何修改告訴我,謝謝大家。

1 Answer

Rating
  • Samuel
    Lv 5
    1 decade ago
    Favorite Answer

    1. 先說明瀏覽器代理伺服器設定, 我只有微軟的IE, 所以只說明IE:

    工具->網際網路選項->連線->[區域網路設定]->Proxy伺服器 在你的區域網路使用...打勾->位址:填入127.0.0.1(如果是本機)連接埠:6789->確定->確定

    2. socket 雖然是雙向的, 但是雙方要知道互相傳的是什protocol, 這裡是 HTTP, 才知道何時資料已經讀完, 對方已經等著收資料, 此時才開始傳. 如果資料未讀完就開始傳送, 對方(IE)是不知接收的.

    3. "本機所快取的物件" 您自己根據印出的 HTTP request 判斷吧

    4. 先執行 TCPServer, 然後在您的IE隨便連一個網頁,(其實隨便打也行啦, 因為我們自己寫的Proxy並沒有連出去, 每次都送同樣的網頁).同時您就可以看到在TCPServer那個黑黑畫面開始瘋狂的印出IE送出的HTTP request.

    5. 程式如下, 註解在程式裡:

    import java.io.*;

    import java.net.*;

    import java.text.*;

    import java.util.*;

    class TCPServer {

    public static void main(String argv[]) throws Exception {

    String clientSentence;

    String capitalizedSentence;

    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US);//時間格式化

    String body, head;//送回的HTTP字串

    ServerSocket welcomeSocket = new ServerSocket(6789);

    while (true) {

    Socket connectionSocket = welcomeSocket.accept();//在 TCP 6789 port Listen

    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

    //讀進全部的 HTTP request(接收用戶端輸入的多行資料)

    while ((clientSentence = inFromClient.readLine()) != null) {

    System.out.println(clientSentence);//印出收到的HTTP request

    if (clientSentence.length() <= 2)//HTTP request 表頭最後是一個空白行

    break;//必須結束read,進行以下送出HTTP response

    }

    try {//組 HTTP response

    body = "<html><body><h1 style='color:green;'>Hello World!</h1>" +

    df.format(new Date()) + "</body></html>";

    head = "HTTP/1.1 200 OK\nDate: " + df.format(new Date()) + "\n" +

    "Content-Type: text/html\nContent-Length: " + body.length() + "\n\n";

    outToClient.writeBytes(head + body);//將 HTTP response 送回Browser

    } catch (Exception e) {//攔下可能的Browser關閉連線

    System.out.println(e.getMessage());

    } finally {

    connectionSocket.close();//關閉連線

    }

    }

    }

    }

Still have questions? Get your answers by asking now.