Python 官方文档:入门教程 => 点击学习
目录Socket连接模型消息协议传输过程中数据类型需要了解的细节tcp通信代码上篇教程回顾 ServerSocket --监听客户端的连接,他的作用主要是建立一个连接 -Serve
上篇教程回顾
ServerSocket --监听客户端的连接,他的作用主要是建立一个连接
-ServerSocket -建立连接,拿到一个Socket
-Telnet 127.0.0.1 8888- 客户端使用Telnet访问服务端 建立连接
-服务端可以拿到一个Socket的对象
-获取这个对象的输入输出流
-写入和读取数据
服务端和客户端通过Socket进行连接,虽然是一个Socket,但是相当于把这一个Socket分成了两个管道,服务端拿着这两根管道的一段,客户端拿着这两根管道的另一端。
TCP:面向连接
UDP:不需要建立连接 类似数据报
TCP:稳定,要求发送数据前必须确认双方都可以收发消息
连接过程 : 三次握手
Server--------------------- Client
1: 监听-----------------------发送请求
这步之后,服务端知道客户端可以发数据
2:收到请求,应答------------收到应答消息,发送应答包给s
这步之后,客户端知道服务端可收发数据
3:收到应答
这步之后,服务端知道客户端可以收数据
char:16bit 两个字节Byte
数据发送的单位:数据每次发送一个byte,一个char需要发送两次单字节
发送文字消息
数据类型:
1100 1101 1010
如这个数据第一个字节有两个1,则代表它是一个汉子,并且后面两个字节都表示这个汉字,如果有111就读取后面三个字节
因为英文用ASCII码存储0-127,第一位不可能是1,通过第一个字节可以判断是中文还是英文
通过自己编写一个客户端和服务端,实现消息的首发,这里的核心主要是自己编写通信协议,我在这里第一次发送到是数据的长度,并且做了数据加密,客户端需要解析这个数据长度,并创建对应长度的数组,才能正确读取消息内容
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通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java后端学习精华之TCP通信传输协议详解
本文链接: https://www.lsjlt.com/news/137064.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0