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

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

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

上篇教程回顧

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

Socket連接模型

在這里插入圖片描述

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

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

消息協(xié)議

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

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

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

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

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

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

發(fā)送文字消息

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

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

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

1100 1101 1010

如這個數(shù)據(jù)第一個字節(jié)有兩個1,則代表它是一個漢子,并且后面兩個字節(jié)都表示這個漢字,如果有111就讀取后面三個字節(jié)
因為英文用ASCII碼存儲0-127,第一位不可能是1,通過第一個字節(jié)可以判斷是中文還是英文

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

TCP通信代碼

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

        int length1=input.read();
        int length2=input.read();
        int msglength=length2*3+length1;
        System.out.println("消息長度為:"+msglength);
        byte[] msgbytes=new byte[msglength];
        input.read(msgbytes);
        String getmsg=new String(msgbytes);
        System.out.println("服務(wù)器說:"+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ù)端測試
 * @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()+"端口號:"+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();//刷新緩沖,管道強制刷出
        String msg="服務(wù)器連接成功?。?!中秋快樂!<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());
//        }
    }
}

運行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

還可以完善的地方

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    理解java多線程中ExecutorService使用

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

最新評論

双桥区| 雷山县| 临湘市| 商水县| 阆中市| 新源县| 伊宁县| 会泽县| 离岛区| 炉霍县| 南木林县| 象山县| 朔州市| 磐石市| 呈贡县| 祁东县| 同德县| 吉水县| 二手房| 延津县| 永宁县| 怀远县| 大理市| 中西区| 新野县| 滦平县| 银川市| 东平县| 宁武县| 永仁县| 侯马市| 瓮安县| 榆树市| 新龙县| 阳城县| 华宁县| 新巴尔虎左旗| 五莲县| 道真| 上虞市| 台江县|