1 TCP的定义
TCP
(Transmission Control Protocol传输控制协议)是一种面向连接的
、可靠的
、基于字节流
的传输层通信协议。简单地说 就是一个双方通信的一个规范标准(协议)。
2 TCP三次握手连接建立过程
Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;
Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
3 聊天记录实例
客户1号:“干嘛呢?吃饭了吗?”
客户2号:“还没有。”
客户1号:“你要记得吃饭啊,身体最重要。”
客户2号: “知道了。”
客户1号:“这周出去玩吧。”
客户2号:“不喜欢,没有时间。”
4 实例代码
客户端1号代码:
package com.weh.demo02;
//TCP实现聊天:客户端1号
public class Client01 {
public static void main(String[] args) {
// 开启线程,(Lambda线程体)
new Thread(() -> {
new ServerReceiver(4444).receive();
}).start();
new Thread(() -> {
new ClientSend("localhost",2222,"Client01").send();
}).start();
}
}
客户端2号代码:
package com.weh.demo02;
//TCP实现聊天:客户端2号
public class Client02 {
public static void main(String[] args) {
// 开启线程,(Lambda线程体)
new Thread(() -> {
new ServerReceiver(2222).receive();
}).start();
new Thread(() -> {
new ClientSend("localhost",4444,"Client02").send();
}).start();
}
}
发送信息代码:
package com.weh.demo02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/* 发送信息 */
public class ClientSend {
BufferedReader reader = new BufferedReader(new InputStreamReader((System.in)));
/* 初始化 */
Socket socket =null;
private final String LocalhostIP; //本地ip
private final int Port; //发送端口号
private final String CyberName;//网名
/* 构造方法 */
public ClientSend(String LocalhostIP, int Port, String CyberName) {
this.LocalhostIP = LocalhostIP;
this.Port = Port;
this.CyberName=CyberName;
}
/* 执行发送功能 */
public void send() {
try {
//循环发送信息
while (true) {
// 获取输入数据
String data = reader.readLine();
// 与服务器进行连接
socket = new Socket(InetAddress.getByName(LocalhostIP),Port);
// 创建输出流
OutputStream os = socket.getOutputStream();
if(data.equals("End!")){
os.write(data.getBytes());
break;
}
// 将获取的数据转化为字节流,再将其发送给服务器端
os.write((CyberName+":"+data).getBytes());
os.flush();//清空缓冲区的数据
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收信息代码:
package com.weh.demo02;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/* 接收信息 */
public class ServerReceiver {
// 初始化
ServerSocket server =null;
Socket socket = null;
private final int Port; //服务器端口号
// 构造方法
public ServerReceiver(int Port) {
this.Port = Port;
}
/* 执行接收信息的功能 */
public void receive(){
try {
// 阻塞式监听,会一直等待客户端连接
server = new ServerSocket(Port);
boolean flag = true;
// 循环接收信息
while (true) {
socket = server.accept();//接受客户端的连接
if (flag){
System.out.println("\033[1;93;45m" + "对方在线中"+"\033[m");//控制台输出颜色字体
flag=false;
}
// 创建输入流,再将发送端的信息进行接收
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
// 将字节流转化成字符流,并读取该数据
int len = inputStream.read(bytes);
String data = new String(bytes, 0, len);
if (data.equals("End!")){
System.err.println("对方已离线");//显示对方已离线
}
// 输出客户端发送过来的数据
System.out.println("\033[1;94m" +data);//控制台输出颜色字体
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
5 效果展示
博主后记:
希望看到此篇博文的网友,如果发现有什么不对的地方,欢迎在下方留言指正!博主一定虚心接受并改正!大家一起共同进步。如果对你有所帮助,可以给博主一个赞👍。