最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解

 更新時(shí)間:2021年09月28日 17:03:31   作者:冷丁_  
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會(huì)保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層

上篇教程回顧

ServerSocket --監(jiān)聽客戶端的連接,他的作用主要是建立一個(gè)連接
-ServerSocket -建立連接,拿到一個(gè)Socket
-Telnet 127.0.0.1 8888- 客戶端使用Telnet訪問(wèn)服務(wù)端 建立連接
-服務(wù)端可以拿到一個(gè)Socket的對(duì)象
-獲取這個(gè)對(duì)象的輸入輸出流
-寫入和讀取數(shù)據(jù)

Socket連接模型

在這里插入圖片描述

服務(wù)端和客戶端通過(guò)Socket進(jìn)行連接,雖然是一個(gè)Socket,但是相當(dāng)于把這一個(gè)Socket分成了兩個(gè)管道,服務(wù)端拿著這兩根管道的一段,客戶端拿著這兩根管道的另一端。

  • Server的input與Client的output相連
  • 客戶端發(fā)送數(shù)據(jù),從Client的output發(fā)送,傳輸?shù)絊erver的input接收
  • 服務(wù)端發(fā)送數(shù)據(jù),從Server的output發(fā)送,傳輸?shù)紺lient的input接收
  • 如果實(shí)現(xiàn)雙端收發(fā)通信,每個(gè)程序至少需要兩個(gè)線程

消息協(xié)議

TCP:面向連接
UDP:不需要建立連接 類似數(shù)據(jù)報(bào)

TCP:穩(wěn)定,要求發(fā)送數(shù)據(jù)前必須確認(rèn)雙方都可以收發(fā)消息
連接過(guò)程 : 三次握手
Server--------------------- Client

1: 監(jiān)聽-----------------------發(fā)送請(qǐng)求
這步之后,服務(wù)端知道客戶端可以發(fā)數(shù)據(jù)
2:收到請(qǐng)求,應(yīng)答------------收到應(yīng)答消息,發(fā)送應(yīng)答包給s
這步之后,客戶端知道服務(wù)端可收發(fā)數(shù)據(jù)
3:收到應(yīng)答
這步之后,服務(wù)端知道客戶端可以收數(shù)據(jù)

傳輸過(guò)程中數(shù)據(jù)類型需要了解的細(xì)節(jié)

char:16bit 兩個(gè)字節(jié)Byte

數(shù)據(jù)發(fā)送的單位:數(shù)據(jù)每次發(fā)送一個(gè)byte,一個(gè)char需要發(fā)送兩次單字節(jié)

發(fā)送文字消息

  • 第一部分應(yīng)發(fā)送字符串的長(zhǎng)度,以便確定字節(jié)數(shù)組的長(zhǎng)度
  • 對(duì)方,讀取的第一個(gè)字節(jié)是消息長(zhǎng)度,定義一個(gè)固定容量大小的容器
  • 第二部分為消息內(nèi)容
  • 對(duì)方,讀取對(duì)應(yīng)長(zhǎng)度的字節(jié)后,將其轉(zhuǎn)成對(duì)應(yīng)的數(shù)據(jù)(String對(duì)象)

數(shù)據(jù)類型:

  • 整數(shù)型:byte short int long
  • 浮點(diǎn)型:float double
  • 字符型:char
  • 布爾型:boolean
  • char=16bit=2 byte unicode編碼
  • utf-8:1-6個(gè)字節(jié)組成一個(gè)漢字

1100 1101 1010

如這個(gè)數(shù)據(jù)第一個(gè)字節(jié)有兩個(gè)1,則代表它是一個(gè)漢子,并且后面兩個(gè)字節(jié)都表示這個(gè)漢字,如果有111就讀取后面三個(gè)字節(jié)
因?yàn)橛⑽挠肁SCII碼存儲(chǔ)0-127,第一位不可能是1,通過(guò)第一個(gè)字節(jié)可以判斷是中文還是英文

  • 英文字母全部兼容:ASCII 0-127 二進(jìn)制碼:0-255,所以0-127一定以0開頭,漢字是16bit 0-65536

TCP通信代碼

通過(guò)自己編寫一個(gè)客戶端和服務(wù)端,實(shí)現(xiàn)消息的首發(fā),這里的核心主要是自己編寫通信協(xié)議,我在這里第一次發(fā)送到是數(shù)據(jù)的長(zhǎng)度,并且做了數(shù)據(jù)加密,客戶端需要解析這個(gè)數(shù)據(jù)長(zhǎng)度,并創(chuàng)建對(duì)應(yīng)長(zhǎng)度的數(shù)組,才能正確讀取消息內(nèi)容
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客戶端測(cè)試
 * @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("服務(wù)器說(shuō):"+new String(msgbyte));

        int length1=input.read();
        int length2=input.read();
        int msglength=length2*3+length1;
        System.out.println("消息長(zhǎng)度為:"+msglength);
        byte[] msgbytes=new byte[msglength];
        input.read(msgbytes);
        String getmsg=new String(msgbytes);
        System.out.println("服務(wù)器說(shuō):"+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服務(wù)端測(cè)試
 * @author: 王丁
 * @date: 2021-09-20 10:03
 **/
public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        //監(jiān)聽客戶端的Socket連接
        System.out.println("服務(wù)端開啟:ip:"+serverSocket.getInetAddress().getHostAddress()+"端口號(hào):"+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("服務(wù)器連接成功?。?!".getBytes());
//        output.flush();//刷新緩沖,管道強(qiáng)制刷出
        String msg="服務(wù)器連接成功?。。≈星锟鞓?lè)!<include/bits/stdc++.h> using namespace std";
        byte[] msgBytes=msg.getBytes();
        int length1=msgBytes.length%3;
        int length2=msgBytes.length/3;
        output.write(length1);
        output.write(length2);
        output.write(msgBytes);
        output.flush();
//        while(input.read()!=-1){
//            System.out.println((char) input.read());
//        }
    }
}

運(yùn)行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

還可以完善的地方

1、之后通信協(xié)議可以加入,通過(guò)客戶端列表,轉(zhuǎn)發(fā)消息內(nèi)容到多個(gè)客戶端
2、攜帶用戶名、目標(biāo)用戶名等等

到此這篇關(guān)于Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解的文章就介紹到這了,更多相關(guān)Java TCP通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中過(guò)濾器、監(jiān)聽器和攔截器的區(qū)別詳解

    Java中過(guò)濾器、監(jiān)聽器和攔截器的區(qū)別詳解

    這篇文章主要介紹了Java中過(guò)濾器、監(jiān)聽器和攔截器的區(qū)別詳解,有些朋友可能不了解過(guò)濾器、監(jiān)聽器和攔截器的區(qū)別,本文就來(lái)詳細(xì)講一下,相信看完你會(huì)有所收獲,需要的朋友可以參考下
    2024-01-01
  • springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法

    springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法

    這篇文章主要介紹了springboot 整合EhCache實(shí)現(xiàn)單服務(wù)緩存的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • java中字符串與日期的轉(zhuǎn)換實(shí)例

    java中字符串與日期的轉(zhuǎn)換實(shí)例

    java中字符串與日期的轉(zhuǎn)換實(shí)例,需要的朋友可以參考一下
    2013-05-05
  • spring boot 日志/頁(yè)面處理、實(shí)體類構(gòu)建、后臺(tái)管理功能的實(shí)現(xiàn)

    spring boot 日志/頁(yè)面處理、實(shí)體類構(gòu)建、后臺(tái)管理功能的實(shí)現(xiàn)

    這篇文章主要介紹了spring boot 日志/頁(yè)面處理、實(shí)體類構(gòu)建、后臺(tái)管理功能的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • java生成XML的方法【附demo源碼下載】

    java生成XML的方法【附demo源碼下載】

    這篇文章主要介紹了java生成XML的方法,涉及java針對(duì)xml格式文件的簡(jiǎn)單操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-12-12
  • Java多線程實(shí)現(xiàn)多人聊天室功能

    Java多線程實(shí)現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java多線程實(shí)現(xiàn)多人聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java語(yǔ)言中4種內(nèi)部類的超詳細(xì)講解

    Java語(yǔ)言中4種內(nèi)部類的超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java語(yǔ)言中4種內(nèi)部類的超詳細(xì)講解,內(nèi)部類可以分為:實(shí)例內(nèi)部類、靜態(tài)內(nèi)部類和成員內(nèi)部類,每種內(nèi)部類都有它特定的一些特點(diǎn),文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Java實(shí)現(xiàn)雙保險(xiǎn)線程的示例代碼

    Java實(shí)現(xiàn)雙保險(xiǎn)線程的示例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)雙保險(xiǎn)線程的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 淺析Spring獲取Bean的九種方法詳解

    淺析Spring獲取Bean的九種方法詳解

    隨著SpringBoot的普及,Spring的使用也越來(lái)越廣,在某些場(chǎng)景下,我們無(wú)法通過(guò)注解或配置的形式直接獲取到某個(gè)Bean。比如,在某一些工具類、設(shè)計(jì)模式實(shí)現(xiàn)中需要使用到Spring容器管理的Bean,此時(shí)就需要直接獲取到對(duì)應(yīng)的Bean,這篇文章主要介紹了Spring獲取Bean的九種方法
    2023-01-01
  • 理解java多線程中ExecutorService使用

    理解java多線程中ExecutorService使用

    這篇文章主要幫助大家理解java多線程中ExcetorServiced的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論

锦州市| 澄迈县| 陇川县| 班戈县| 建水县| 齐河县| 类乌齐县| 拜城县| 南安市| 汉阴县| 新安县| 曲水县| 阿瓦提县| 北安市| 南雄市| 桃源县| 青州市| 鹿泉市| 凯里市| 威宁| 阿拉善盟| 广东省| 安顺市| 永川市| 五大连池市| 长寿区| 驻马店市| 太湖县| 赞皇县| 炉霍县| 新乡县| 喀喇| 中方县| 盖州市| 乐昌市| 吉木萨尔县| 澄江县| 沁阳市| 景东| 长岛县| 卢龙县|