您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java后端開發中TCP通信傳輸協議怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
ServerSocket --監聽客戶端的連接,他的作用主要是建立一個連接
-ServerSocket -建立連接,拿到一個Socket
-Telnet 127.0.0.1 8888- 客戶端使用Telnet訪問服務端 建立連接
-服務端可以拿到一個Socket的對象
-獲取這個對象的輸入輸出流
-寫入和讀取數據
服務端和客戶端通過Socket進行連接,雖然是一個Socket,但是相當于把這一個Socket分成了兩個管道,服務端拿著這兩根管道的一段,客戶端拿著這兩根管道的另一端。
Server的input與Client的output相連
客戶端發送數據,從Client的output發送,傳輸到Server的input接收
服務端發送數據,從Server的output發送,傳輸到Client的input接收
如果實現雙端收發通信,每個程序至少需要兩個線程
TCP:面向連接
UDP:不需要建立連接 類似數據報
TCP:穩定,要求發送數據前必須確認雙方都可以收發消息
連接過程 : 三次握手
Server--------------------- Client
1: 監聽-----------------------發送請求
這步之后,服務端知道客戶端可以發數據
2:收到請求,應答------------收到應答消息,發送應答包給s
這步之后,客戶端知道服務端可收發數據
3:收到應答
這步之后,服務端知道客戶端可以收數據
char:16bit 兩個字節Byte
數據發送的單位:數據每次發送一個byte,一個char需要發送兩次單字節
發送文字消息
第一部分應發送字符串的長度,以便確定字節數組的長度
對方,讀取的第一個字節是消息長度,定義一個固定容量大小的容器
第二部分為消息內容
對方,讀取對應長度的字節后,將其轉成對應的數據(String對象)
數據類型:
整數型:byte short int long
浮點型:float double
字符型:char
布爾型:boolean
char=16bit=2 byte unicode編碼
utf-8:1-6個字節組成一個漢字
1100 1101 1010
如這個數據第一個字節有兩個1,則代表它是一個漢子,并且后面兩個字節都表示這個漢字,如果有111就讀取后面三個字節
因為英文用ASCII碼存儲0-127,第一位不可能是1,通過第一個字節可以判斷是中文還是英文
英文字母全部兼容:ASCII 0-127 二進制碼:0-255,所以0-127一定以0開頭,漢字是16bit 0-65536
通過自己編寫一個客戶端和服務端,實現消息的首發,這里的核心主要是自己編寫通信協議,我在這里第一次發送到是數據的長度,并且做了數據加密,客戶端需要解析這個數據長度,并創建對應長度的數組,才能正確讀取消息內容
MsgClient
package com.lding.net; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * @program: Net * @description: Tcp客戶端測試 * @author: 王丁 * @date: 2021-09-20 10:04 **/ public class TcpClient { public static void main(String[] args) throws IOException { Socket socket=new Socket("127.0.0.1",8888); OutputStream output=socket.getOutputStream(); InputStream input=socket.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(input); // byte[] msgbyte=new byte[30]; // input.read(msgbyte); // System.out.println("服務器說:"+new String(msgbyte)); int length2=input.read(); int length3=input.read(); int msglength=length3*3+length2; System.out.println("消息長度為:"+msglength); byte[] msgbytes=new byte[msglength]; input.read(msgbytes); String getmsg=new String(msgbytes); System.out.println("服務器說:"+getmsg); } }
MsgServer
package com.lding.net; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * @program: Net * @description: Tcp服務端測試 * @author: 王丁 * @date: 2021-09-20 10:03 **/ public class TcpServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); //監聽客戶端的Socket連接 System.out.println("服務端開啟:ip:"+serverSocket.getInetAddress().getHostAddress()+"端口號:"+serverSocket.getLocalSocketAddress()); System.out.println("正在等待有緣人......"); Socket socketClient = serverSocket.accept(); System.out.println("客戶端已連接:"+socketClient.getInetAddress()); System.out.println("客戶端端口"+socketClient.getPort()); OutputStream output=socketClient.getOutputStream(); InputStream input=socketClient.getInputStream(); // output.write("服務器連接成功!!!".getBytes()); // output.flush();//刷新緩沖,管道強制刷出 String msg="服務器連接成功!!!中秋快樂!<include/bits/stdc++.h> using namespace std"; byte[] msgBytes=msg.getBytes(); int length2=msgBytes.length%3; int length3=msgBytes.length/3; output.write(length2); output.write(length3); output.write(msgBytes); output.flush(); // while(input.read()!=-1){ // System.out.println((char) input.read()); // } } }
運行結果
還可以完善的地方
1、之后通信協議可以加入,通過客戶端列表,轉發消息內容到多個客戶端
2、攜帶用戶名、目標用戶名等等
關于“Java后端開發中TCP通信傳輸協議怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。