2007年11月13日 星期二

Head First Java 讀後整理(12) - Make a Connection

1、要讓 client 與 server 可以互相連結運作,流程如下
  • client 藉由建立 Socket 來連接 server
  • 一旦建立連線,client 可以從 socket 取得低階 output stream
  • 透過 InputStreamReader 與 Socket 的 input stream 來讀取 server 的文字資料,並建構 BufferedReader之鏈結
Socket s = new Socket("127.0.0.1", 4242);
//使用 InputStreamReader 與來自 Socket 的 input stream 結合以取得 server 資料
//再使用 BufferedReader 與之鏈結,進行文字資料擷取
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
//讀取來自 server 的文字資料
String advice = reader.readLine();

2、Socket 是個代表兩台機器之間網路連線的 object

3、要建構 Socket 連線,必須知道 IP address 與 port number

4、InputStreamReader 用來將 byte 轉換成字元,主要作為 BufferedReader 與 Socket input stream 的橋樑

5、從 Socket 上讀取資料,使用 BufferedReader;寫資料到 Socket 上,使用 PrintWriter
6、Server 的運作方式
  • server 應用程式對特定 port 建構出 ServerSocket
  • client 對 server 應用程式建構 Socket 連線
  • serevr 建構出與 client 通訊的新 Socket (新 Socket 與 ServerSocket 所用的 port number 並不相同,因此 ServerSocket 可以空出來等待其他 client)

7、建構 PrintWriter 與 socket output stream 進行鏈結,便可用 print() 與 println() 來送 String 給 server

8、server 使用 ServerSocket 來等待 client 對特定 port 的要求

9、當 ServerSocket 接到要求時,會產生一個新的 socket 連線來接受 client 的要求

10、在 Java 中,每個 thread 都有獨立的執行空間,每個 thread 都需要任務,而任務是實作 Runnable interface 的實體

11、Thread 初始化之後,在呼叫 start() 之前都處於新建構的狀態

12、呼叫 Thread object 的 start() 之後,會建構出新的執行空間,並處於可執行狀態等待 scheduler 安排執行

13、當 scheduler 選擇某個 thread 之後,它就處於執行中的狀態(單處理器的機器只能有一個執行中的 thread)

14、有時候 thread 會因為某些原因被 block 住

15、scheduler 不能保證任何執行時的時間與順序,因此不要想要透過 sleep 的方式調整 thread 執行順序

16、用 setName() 幫 thread 命名通常是用在 debug 之用

17、兩個或以上的 thread 存取 heap 上相同的物件,可能會發生 concurrency 的問題

18、使用「synchronized」關鍵字修飾 method,可以防止多個 thread 同時進入同一個 object 來執行相同 method

19、object 就算有多個 synchronized method,也還是只有一個 key
一旦某個 thread 進入該 object 的 synchronized method,其他 thread 就無法進入該 object 上的任何 synchronized method

沒有留言:

張貼留言