標籤:路由 nbsp 服務 傳輸過程 color 定位 ack 遍曆 str
No1:
網路傳輸應用通常使用TCP、IP或UDP這三種協議實現資料轉送。在傳輸資料的過程中,需要通過一個雙向的通訊串連實現資料的互動。在這個傳輸過程中,通常將這個雙向鏈路的一端稱為Socket,一個Socket通常由一個IP地址和一個連接埠號碼來確定。
No2:
在網路編程中有兩個主要的問題,一個是如何準確地定位網路上的一台或多台主機,另一個就是找到主機後如何可靠高效地進行資料轉送。
在TCP/IP協議中IP層主要負責網路主機的定位,資料轉送的路由,由IP地址可以唯一地確定Internet上的一台主機。而TCP層則提供面嚮應用的可靠(TCP)的或非可靠(UDP)的資料轉送機制。
No3:
Socket工作過程基本步驟:
1)建立Socket
2)開啟串連到Socket的輸入/輸出流
3)按照一定的協議對Socket進行讀/寫操作
4)關閉Socket
No4:
聊天室程式在服務端包含多條線程,其中每個Socket對應一條線程,該線程負責讀取Socket對應輸入資料流的資料(從用戶端發送過來的資料),並將讀到的資料向每個Socket輸出資料流發送一遍(將衣蛾用戶端發送的資料“廣播”給其他用戶端),因此需要在伺服器端使用List來儲存所有的Socket。
public class IServer{ //定義儲存所有Socket的ArrayList public static ArrayList<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException{ ServerSocket ss = new ServerSocket(3000); while(true){ //此行代碼會阻塞,將一直等待別人的串連 Socket s = ss.accept(); socketList.add(s); //每當用戶端串連後啟動一條ServerThread線程為該用戶端服務 new Thread(new Serverxian(s)).satart(); } }}
//負責處理每個線程通訊的線程類public class Serverxian implements Runnable{ //定義當前線程所處理的Socket Socket s = null; //該線程所處理的Socket所對應的輸入資料流 BufferedReader br = null; public Serverxian(Socket s) throws IOException{ this.s = s; //初始化該Socket對應的輸入資料流 br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //採用迴圈不斷從Socket中讀取用戶端發送過來的資料 while((content = readFromClient())!=null){ //遍曆socketList中的每個Socket //將讀到的內容向每個Socket發送一次 for(Socket s:IServer.socketList){ PrintStream ps = new PrintStream(s.getOutputStream()); ps.println(content); } } }catch(IOException e){ //e.printStackTrace(); } } //定義讀取用戶端資料的方法 private String readFromClient(){ try{ return br.readLine(); }catch(IOException e){ //如果捕捉到異常,表明該Socket對應的用戶端已經關閉 //刪除該Socket IServer.socketList.remove(s); } return null; }}
《精通android網路開發》--使用Socket實現資料通訊