一.Socket簡介
1.所謂Socket通常也稱作“通訊端”,用於描述IP地址和連接埠,是一個通訊鏈的控制代碼
2.應用程式通常通過“通訊端”向網路發送請求或者應答網路請求
3.Socket有兩種主要的操作方式:連線導向TCP)的和不需連線的UDP)。
4.Java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向串連的用戶端和服務端。
一個用戶端要發起一次通訊,首先必須知道運行伺服器端的主機IP地址。然後由網路基礎設施利用目標地址,將用戶端發送的資訊傳遞到正確的主機上,在 Java中,地址可以由一個字元; 串來定 義,這個字串可以使數字型的地址比如192.168.1.1),也可以是主機名稱example.com)。在 Java中InetAddress類代表了一個網路目標地址,包括主機名稱和數字類型的地址資訊。
二.使用基於TCP協議的Socket
1.ServerSocket:
ServerSocket:這個類是實現了一個伺服器端的Socket,利用這個類可以監聽來自網路的請求。
(a)建立ServerSocket的方法:
ServerSocket(IntlocalPort)
ServerSocket(int localport,intqueueLimit)
ServerSocket(int localport,intqueueLimit,InetAddress localAddr)
建立一個ServerSocket必須指定一個連接埠,以便用戶端能夠向該連接埠號碼發送串連請求。連接埠的有效範圍是0-65535(0-1023是系統預留的,最好大於1024)
0~1023的連接埠號碼為系統所保留,例如http服務的連接埠號碼是80,telnet服務的連接埠號碼為21,ftp為23。所以我們在選擇連接埠號碼時最好選擇大 於1023的數,防止發生衝突。在建立 Socket時,如果發生錯誤,將產生IOException,在程式中必須對其進行處理。所以在建立Socket 或ServerSocket時必須捕獲或拋出異常。
(b)ServerSocket操作
1)Socketaccept()
accept()方法為下一個傳入的串連請求建立Socket執行個體,並將已成功串連的Socket執行個體返回給伺服器通訊端,如果沒有串連請求,accept()方法將阻塞等待;
2)void close
close方法用於關閉通訊端
2.Socket
(a)建立Socket的方法:
SocketInetAddress remoteAddress,intremotePort)
利用Socket建構函式,可建立一個TCP通訊端後,先串連到指定的遠程地址和連接埠號碼。
SocketInetAddress address,int port ,InetAddress localAddr ,intlocalPort)
Socket(InetAddress address, int port ,booleanstream)
SocketSocketImpl impl)
address、host、port分別表示雙向串連中另一方的IP地址、主機名稱、連接埠號碼
stream指明Socket是流Socket還是資料報Socket
localAddr,bindAddr是本地機器的地址ServerSocket的主機地址)
impl是Socket的父類,既可以建立ServerSocket,也可建立Socket
(b)操作Socket的方法
通訊過程中順序:伺服器端首先得到輸入資料流,然後將輸入資料流資訊輸出到其各個用戶端
Socket提供了getInputStream()和getOutputStream()方法來得到輸入輸出資料流。然後再對輸入資料流輸出資料流進行讀寫操作,例 如,對於伺服器端,得到Socket對象後,調用getInputStream方法即 可得到來自用戶端的流,調用getOutStream方法可得到向客 戶端發送資料的流。對於用戶端,調用getInputStream方法即可得到來自伺服器的流,調用getOutStream方法可得到向伺服器端發送 數 據的流。
InputStreamgetInputStream()
OutputStreamgetOutputStream()
可調用Socket的close()方法進行關閉,在關閉前,應將與Socket相關的所有輸入輸出資料流關閉,正著開啟,倒著關閉。
3.編程步驟:
建立伺服器的步驟:
指定連接埠執行個體化一個ServerSocket調用ServerSocket的accept方法以在等待串連期間造成阻塞擷取位於該底層Socket的流以進行讀寫操作將資料封裝成流對Socket進行讀寫關閉開啟的流
建立用戶端的步驟:
通過IP地址和連接埠執行個體化Socket,請求串連伺服器擷取Socket上的流以進行讀寫把流封裝進BufferedReader/PrintWriter的執行個體對Socket進行讀寫關閉開啟的流
當要監控多個用戶端時,可使用類ExecutorService
其對象擷取方法:Executors.newCachedThreadPool();
調用該對象的execute(Runnablecommand)即可,在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由Executor實現決定
三.使用基於UDP的Socket
a)建立DatagramSocket
DatagramSocket(byte [] data,intoffset,int length,InetAddress remoteAddr,intremotePort)
該建構函式建立一個資料報文對象,資料包含在第一個參數data當中
Offset是指位移量長度,length是指資料包長度。
b)建立DatagramSocket
DatagramSocket(intlocalPort)
以上建構函式將建立一個UDP通訊端;
c)DatagramSocket:發送和接受
void send(DatagramPacketpacket)
void receive(DatagramPacketpacket)
send()方法用來發送DatagramPacket執行個體。一旦建立串連,資料報將發送到該通訊端所串連的地址;
receive()方法將阻塞等待,知道接收到資料報文,並將報文中的資料複製到指定的DatagramPacket執行個體中。
補充:
對AndroidManifest.xml的配置一定不要忘了:
<uses-permissionandroid:name="android.permission.INTERNET"/>
輸入和輸出資料流要用DataOutputStream和DataOutputStream,不可以用PrintWriter、StreamReader等。
編輯精選】