TCP/IP协议的一个具体实现Socket
java?中Socket的用法
TCP/IP協(xié)議
兩個不同的協(xié)議,放在一起說。IP協(xié)議是用來查找地址的,對應網(wǎng)際互連層;TCP協(xié)議是用來規(guī)范傳輸規(guī)則的,對應傳輸層。
TCP在傳輸之前會進行三次溝通(三次握手),傳完數(shù)據(jù)斷開的時候會進行四次溝通(四次揮手)
兩個序號和三個標志位
seq(sequence number)表示所傳數(shù)據(jù)的序號;TCP傳輸時每一個字節(jié)都由一個序號,發(fā)送數(shù)據(jù)時會將數(shù)據(jù)的第一個序號發(fā)送給對方,接收方會按序號檢查數(shù)據(jù)是否接收完整了。(如不完整,則重新發(fā)送)
ack(acknoledgement number)表示確認號,接收端用它來給發(fā)送端反饋已經(jīng)成功接收到的數(shù)據(jù)的信息,它的值為希望接收的下一個數(shù)據(jù)包起始序號(該序號值前面的數(shù)據(jù)已經(jīng)接收到了)
ACK:確認位,只有ACK=1時,ack才起作用。?正常通信時ACK=1,第一次發(fā)起請求時因為沒有需要確認接收的數(shù)據(jù)(ACK=0)
SYN:同步位,用于在建立連接時同步序號。當接收端接收到SYN=1報文時會直接將ack設置為接收到的seq+1的值
SYN會在前兩次握手時都為1(通信的雙方的ack都需要設置一個初始值)
FIN:終止位,用來在數(shù)據(jù)傳輸完畢后釋放連接
TCP傳輸是雙全工模式,傳輸雙方是對等的,可以同時傳輸數(shù)據(jù)。
四次揮手就是雙方分別發(fā)送FIN標志來關閉連接并讓對方確認。
?
傳輸層的協(xié)議還有UDP(TCP有連接,UDP沒有連接,UDP拿到地址后直接傳輸,速度快,不可靠。通常視頻傳輸、語音傳輸?shù)葘ν暾砸蟛桓叩那覍λ俣纫蟾?、?shù)據(jù)量大的通信多使用UDP;郵件,網(wǎng)頁一般使用TCP協(xié)議)
?
java中網(wǎng)絡通信是通過Socket實現(xiàn)的;分為ServerSocket(在服務端,通過accept()監(jiān)聽請求,監(jiān)聽到請求后返回Socket對象)和Socket(用于具體完成數(shù)據(jù)傳輸,在客戶端直接使用Socket發(fā)起請求并傳輸數(shù)據(jù))
?
ServerSocket的使用分三步:
一.創(chuàng)建ServerSocket? ? 有5個構(gòu)造方法,最方便的是ServerSocket(int port){? }? 只需一個端口號即可
二.ServerSocket.accept()進行監(jiān)聽,該方法是阻塞方法(調(diào)用后程序會停下來等待連接請求,在接收到請求之前程序不會繼續(xù)走下去;當接收到請求后該方法會返回一個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 //創(chuàng)建一個ServerSocket監(jiān)聽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 //創(chuàng)建PrintWriter,用于發(fā)送數(shù)據(jù) 17 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 18 pw.println("發(fā)送數(shù)據(jù):"+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)構(gòu)造方法傳入目標主機的地址和端口,其創(chuàng)建過程就會與服務端建立連接。
1 import java.io.*; 2 import java.net.Socket; 3 4 public class Client{ 5 public static void main(String args[]){ 6 String msg="客戶端要傳的數(shù)據(jù)......"; 7 try{ 8 //創(chuàng)建一個Socket,和本機的8080端口連接 9 Socket socket=new Socket("127.0.0.1",8080); 10 //使用Socket創(chuàng)建PrintWriter和Bufferedreader讀寫數(shù)據(jù) 11 PrintWriter pw=new PrintWriter(socket.getOutputStream()); 12 BufferedReader bf=new BufferedReader(new InputStreamReader(socket.getInputStream())); 13 //發(fā)送數(shù)據(jù) 14 pw.println(msg); 15 pw.flush(); 16 //接收數(shù)據(jù) 17 String line=br.readLine(); 18 System.out.println("從服務端接收數(shù)據(jù):"+line); 19 //關閉資源 20 pw.close(); 21 br.close(); 22 socket.close(); 23 }catch(Exception e){ 24 e.printStackTrace(); 25 } 26 } 27 }?
先啟動Server,在啟動Client就可完成一次通信。
?
轉(zhuǎn)載于:https://www.cnblogs.com/code2038/p/9737724.html
總結(jié)
以上是生活随笔為你收集整理的TCP/IP协议的一个具体实现Socket的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: portainer图形化监控
- 下一篇: 快速理解编码,unicode与utf-8