TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。简单地说 就是一个双方通信的一个规范标准(协议)。
Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;
Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
客户1号:在干嘛呢?吃饭了吗?
客户2号:还没有。
客户1号:你要记得吃饭啊,身体最重要。
客户2号: 知道了。
客户1号:这周去玩吧
客户2号:不喜欢,没时间。
客户端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,"Client02").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,"Client01").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(); } } }
博主后记:
希望看到此篇博文的网友,如果发现有什么不对的地方,欢迎在下方留言指正!博主一定虚心接受并改正!大家一起共同进步。如果对你有所帮助,可以给博主一个赞