日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP/IP协议的一个具体实现Socket

發(fā)布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP/IP协议的一个具体实现Socket 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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設(shè)置為接收到的seq+1的值

SYN會在前兩次握手時都為1(通信的雙方的ack都需要設(shè)置一個初始值)

FIN:終止位,用來在數(shù)據(jù)傳輸完畢后釋放連接

TCP傳輸是雙全工模式,傳輸雙方是對等的,可以同時傳輸數(shù)據(jù)。

四次揮手就是雙方分別發(fā)送FIN標志來關(guān)閉連接并讓對方確認。

?

傳輸層的協(xié)議還有UDP(TCP有連接,UDP沒有連接,UDP拿到地址后直接傳輸,速度快,不可靠。通常視頻傳輸、語音傳輸?shù)葘ν暾砸蟛桓叩那覍λ俣纫蟾摺?shù)據(jù)量大的通信多使用UDP;郵件,網(wǎng)頁一般使用TCP協(xié)議)

?

java中網(wǎng)絡(luò)通信是通過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 //關(guān)閉資源 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。