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

2022/2/22 1:24:16

本文主要是介绍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,"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();
        }

    }
}

5 效果展示

在这里插入图片描述

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



这篇关于Java--网络编程(利用TCP实现简单的双人聊天)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程