Java--网络编程(利用TCP实现简单的双人聊天)

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 效果展示

在这里插入图片描述
在这里插入图片描述

博主后记:
希望看到此篇博文的网友,如果发现有什么不对的地方,欢迎在下方留言指正!博主一定虚心接受并改正!大家一起共同进步。如果对你有所帮助,可以给博主一个赞👍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_WEH_coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值