我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java后端学习精华之TCP通信传输协议详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java后端学习精华之TCP通信传输协议详解

上篇教程回顾

ServerSocket --监听客户端的连接,他的作用主要是建立一个连接
-ServerSocket -建立连接,拿到一个Socket
-Telnet 127.0.0.1 8888- 客户端使用Telnet访问服务端 建立连接
-服务端可以拿到一个Socket的对象
-获取这个对象的输入输出流
-写入和读取数据

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

TCP通信代码

通过自己编写一个客户端和服务端,实现消息的首发,这里的核心主要是自己编写通信协议,我在这里第一次发送到是数据的长度,并且做了数据加密,客户端需要解析这个数据长度,并创建对应长度的数组,才能正确读取消息内容
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;


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 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("服务器说:"+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;


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 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());
//        }
    }
}

运行结果

在这里插入图片描述

在这里插入图片描述

还可以完善的地方

1、之后通信协议可以加入,通过客户端列表,转发消息内容到多个客户端
2、携带用户名、目标用户名等等

到此这篇关于Java后端学习精华之TCP通信传输协议详解的文章就介绍到这了,更多相关Java TCP通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java后端学习精华之TCP通信传输协议详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录