1. 程式人生 > >TCP/IP協議的一個具體實現Socket

TCP/IP協議的一個具體實現Socket

edge 標誌位 col nts 創建過程 表示 連接 main 關閉連接

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