TCP/IP協議的一個具體實現Socket
java 中Socket的用法
TCP/IP協議
兩個不同的協議,放在一起說。IP協議是用來查找地址的,對應網際互連層;TCP協議是用來規範傳輸規則的,對應傳輸層。
TCP在傳輸之前會進行三次溝通(三次握手),傳完數據斷開的時候會進行四次溝通(四次揮手)
兩個序號和三個標誌位
seq(sequence number)表示所傳數據的序號;TCP傳輸時每一個字節都由一個序號,發送數據時會將數據的第一個序號發送給對方,接收方會按序號檢查數據是否接收完整了。(如不完整,則重新發送)
ack(acknoledgement number)表示確認號,接收端用它來給發送端反饋已經成功接收到的數據的信息,它的值為希望接收的下一個數據包起始序號(該序號值前面的數據已經接收到了)
ACK:確認位,只有ACK=1時,ack才起作用。 正常通信時ACK=1,第一次發起請求時因為沒有需要確認接收的數據(ACK=0)
SYN:同步位,用於在建立連接時同步序號。當接收端接收到SYN=1報文時會直接將ack設置為接收到的seq+1的值
SYN會在前兩次握手時都為1(通信的雙方的ack都需要設置一個初始值)
FIN:終止位,用來在數據傳輸完畢後釋放連接
TCP傳輸是雙全工模式,傳輸雙方是對等的,可以同時傳輸數據。
四次揮手就是雙方分別發送FIN標誌來關閉連接並讓對方確認。
傳輸層的協議還有UDP(TCP有連接,UDP沒有連接,UDP拿到地址後直接傳輸,速度快,不可靠。通常視頻傳輸、語音傳輸等對完整性要求不高的且對速度要求高、數據量大的通信多使用UDP;郵件,網頁一般使用TCP協議)
java中網絡通信是通過Socket實現的;分為ServerSocket(在服務端,通過accept()監聽請求,監聽到請求後返回Socket對象)和Socket(用於具體完成數據傳輸,在客戶端直接使用Socket發起請求並傳輸數據)
ServerSocket的使用分三步:
一.創建ServerSocket 有5個構造方法,最方便的是ServerSocket(int port){ } 只需一個端口號即可
二.ServerSocket.accept()進行監聽,該方法是阻塞方法(調用後程序會停下來等待連接請求,在接收到請求之前程序不會繼續走下去;當接收到請求後該方法會返回一個Socket對象)
三.使用accept()方法返回的Socket與客戶端進行通信。
簡單示例:
1 import java.io.*; 2 import java.net.ServerSocket; 3 import java.net.Socket; 4 5 public class Server{ 6 public static void main(String args[]){ 7 try{ 8 //創建一個ServerSocket監聽8080端口 9 Serversocket server=new ServerSocket(8080); 10 //等待請求 11 Socket socket=server.accept(); 12 //接收到請求後使用socket進行通信 13 BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); 14 String line=br.readLine(); 15 System.out.println("從客戶端接收信息:"+line); 16 //創建PrintWriter,用於發送數據 17 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 18 pw.println("發送數據:"+line); 19 pw.flush(); 20 pw.close(); 21 br.close(); 22 socket.close(); 23 server.close(); 24 }catch(Exception e){ 25 e.printStackTrace(); 26 } 27 } 28 }
客戶端Socket
選擇Socket(String host,int port)構造方法傳入目標主機的地址和端口,其創建過程就會與服務端建立連接。
1 import java.io.*; 2 import java.net.Socket; 3 4 public class Client{ 5 public static void main(String args[]){ 6 String msg="客戶端要傳的數據......"; 7 try{ 8 //創建一個Socket,和本機的8080端口連接 9 Socket socket=new Socket("127.0.0.1",8080); 10 //使用Socket創建PrintWriter和Bufferedreader讀寫數據 11 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 12 BufferedReader bf=new BufferedReader(new InputStreamReader(socket.getInputStream())); 13 //發送數據 14 pw.println(msg); 15 pw.flush(); 16 //接收數據 17 String line=br.readLine(); 18 System.out.println("從服務端接收數據:"+line); 19 //關閉資源 20 pw.close(); 21 br.close(); 22 socket.close(); 23 }catch(Exception e){ 24 e.printStackTrace(); 25 } 26 } 27 }
先啟動Server,在啟動Client就可完成一次通信。
TCP/IP協議的一個具體實現Socket