Java TCP協(xié)議通信超詳細講解
什么是tcp
Tcp通信有兩個特點分別是面向連接,具有可靠性.
面向連接:指的是客戶端與服務端之間的連接,在通信之前會有三次握手的機制來確保連接的可靠性.
可靠性:tcp在確保他的可靠性上做了許多的功夫,這個可靠性體現(xiàn)在下面兩方面:
- tcp有狀態(tài):tcp會精確的紀錄哪些數(shù)據(jù)是發(fā)送了的,哪些是沒有被發(fā)送的,他保證數(shù)據(jù)包是按序到達的,不允許存在半點差錯
- tcp是可以控制的:如果存在丟包或者網(wǎng)絡不好的時候,會根據(jù)具體情況對數(shù)據(jù)包進行發(fā)送速度的控制或者對數(shù)據(jù)包進行重新發(fā)送.
如下圖是實現(xiàn)服務器端與客戶端通信的思路:
服務端
服務端用到的類是ServerSocket
ServerSocker類在他的api文檔里面也說了他是實現(xiàn)服務器的一個類
了解一個類我們還是老樣子先了解他的構造方法,我們看一下api文檔
我們常用的構造方法是第一個ServerSocket()
和第二個serverSocket(int port)
.接下來我們只講這兩個方法.
我們先來講講serverSocket()
這個構造方法吧!
serverSocket()
這個構造方法是創(chuàng)建一個沒有綁定端口的對象,一般他和如下方法配套使用
用以上的方法可以綁定一個你指定的ip地址和端口號.
接下來我們再講講第二個常用的構造方法吧 !
ServerSocket(int port)
這個構造函數(shù)創(chuàng)建的是一個綁定本機的一個自定義端口的一個ServerSocket
對象.
如下面的例子
ServerSocket serverSocket = new ServerSocket(6666); //綁定端口號為6666的端口
ServerSocket
常用的方法
accept()
方法是一個監(jiān)聽器,是一個阻塞式,它要等有服務端來連接了才能進行下一步,如果沒有客戶端來連接就會一直等待下去,直到接收到連接才往下運行.這個方法返回的是一個Socket對象,有客戶端來連接,就會產(chǎn)生一個Socket對象.這個Socket對象就負責與服務端進行通信
close
方法是釋放服務器所占用的資源,并且斷開全部客戶端的連接.
客戶端
Socket類
是實現(xiàn)客戶端通信
接下來我們解析socket
類
我們就看常用的socket類的構造方法吧
第一個構造方法
是創(chuàng)建一個連接到的一個指定的ip地址以及指定的端口號的服務器的socket對象.如果你得到的一個Ip地址是一個字符串類型我們還可以使用另一個構造方法
這個構造方法同樣的也是創(chuàng)建一個連接到的一個指定的ip地址以及指定的端口號的服務器的socket對象
我們來看看他的常用方法
我們這里著重講的是getOutputStream()
方法與getInputStream()
getOutputStream()
返回的是一個OutputStream字節(jié)輸出流對象,我們從這里可以知道我們可以發(fā)送數(shù)據(jù)給服務器/客戶端。
getInputStream()
返回有的是InputStream字節(jié)輸入流對象,我們可以通過這個對象接受服務器/客戶端發(fā)來的消息。
服務端與客戶端代碼實現(xiàn)實例
服務端代碼
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; /** * 服務端 * @author Administrator * */ public class Server { public static void main(String[] args) { ServerSocket server = null; Socket socket = null; try { //準備服務器端用的通訊對象(套接字),指明端口號為8888 server = new ServerSocket(8888); //到指定端口去阻塞監(jiān)聽,一旦有客戶端請求發(fā)送過來,那么立即自動與客戶端建立連接 socket = server.accept(); System.out.println("服務器端準備ok"); //我要發(fā)送到客戶端的內容 String msg = "你好,我是服務器,這是我的第一次通訊,請問你收到了嗎"; OutputStream os = socket.getOutputStream();//準備輸出對象 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); bw.write(msg); bw.newLine(); bw.flush(); //接收客戶端發(fā)送的信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String reply = br.readLine(); System.out.println("我是服務器,接收到信息:"+reply); br.close(); is.close(); bw.close(); os.close(); socket.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } }
客戶端代碼
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; /** * 客戶端 * @author Administrator * */ public class Client { public static void main(String[] args) { Socket socket = null; try { socket = new Socket("localhost", 8888); System.out.println("客戶端準備完成"); //客戶端開始接受請求 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String msg = br.readLine(); System.out.println("我是客戶端,接收到信息:"+msg); //客戶端接收到服務器端的信息之后,需要反饋信息給服務器 //客戶端想要反饋給服務器端的信息 String reply = "我是客戶端,收到你的信息,這是我的反饋"; OutputStream os = socket.getOutputStream();//準備客戶端的輸出流 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); bw.write(reply); bw.newLine(); bw.flush(); bw.close(); os.close(); br.close(); is.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
到此這篇關于Java TCP協(xié)議通信超詳細講解的文章就介紹到這了,更多相關Java TCP協(xié)議通信內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Java?redis中緩存穿透?緩存擊穿?雪崩三種現(xiàn)象以及解決方法
緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時的用戶很可能是攻擊者,攻擊會導致數(shù)據(jù)庫壓力過大2022-01-01Java通過動態(tài)代理實現(xiàn)一個簡單的攔截器操作
這篇文章主要介紹了Java通過動態(tài)代理實現(xiàn)一個簡單的攔截器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07詳解SpringBoot構建的Web項目如何在服務端校驗表單輸入
這篇文章主要介紹了詳解SpringBoot構建的Web項目如何在服務端校驗表單輸入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10數(shù)據(jù)庫連接池c3p0配置_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了數(shù)據(jù)庫連接池c3p0配置的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08java利用Apache commons codec進行MD5加密,BASE64加密解密,執(zhí)行系統(tǒng)命令
這篇文章主要介紹了java利用apache Commons包進行MD5加密,BASE64加密解密與執(zhí)行系統(tǒng)命令希望對大家有用2017-12-12