Java实战之基于TCP实现简单聊天程序

Java实战之基于TCP实现简单聊天程序

简介

TCP(Transmission Control Protocol)是一种可靠的传输协议,其保证了数据的可靠传输。而基于TCP的聊天程序则利用了TCP协议的可靠性进行双方的消息传输。本文将介绍如何通过Java实现基于TCP协议的简单聊天程序。

实现步骤

1. 创建服务器端

服务器端实现基于TCP的Socket通信,其实现步骤如下:
1. 创建ServerSocket对象并指定端口号
2. 调用ServerSocket对象的accept()方法监听客户端请求
3. 使用InputStream读取客户端发来的消息
4. 使用OutputStream向客户端发送响应消息

示例代码:

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("服务器已启动,等待客户端连接。。。");
        while (true) {
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = 0;
            StringBuilder sb = new StringBuilder();
            while ((len = inputStream.read(bytes)) != -1) {
                sb.append(new String(bytes, 0, len, "UTF-8"));
            }
            System.out.println("客户端发送的消息是:" + sb.toString());

            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("服务端已接收到消息".getBytes("UTF-8"));
            outputStream.flush();
        }
    }
}

2. 创建客户端

客户端同样实现基于TCP的Socket通信,其实现步骤如下:
1. 创建Socket对象并指定服务器IP和端口号
2. 使用OutputStream向服务器发送消息
3. 使用InputStream读取服务器响应消息

示例代码:

public class Client {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 8080);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好,服务器".getBytes("UTF-8"));
        outputStream.flush();

        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, len, "UTF-8"));
        }
        System.out.println("服务端响应的消息是:" + sb.toString());
    }
}

3. 简单聊天程序

聊天程序需要同时启动服务端和客户端。客户端向服务端发送消息后,服务端再将消息转发给所有连接上的客户端。实现步骤如下:
1. 创建ServerSocket对象并指定端口号
2. 调用ServerSocket对象的accept()方法监听客户端请求,并将连接上的客户端Socket保存到List中
3. 使用InputStream读取客户端发来的消息
4. 将消息发送给所有连接上的客户端

示例代码:
服务端代码

public class ChatServer {
    private static List<Socket> socketList = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("服务器已启动,等待客户端连接。。。");
        while (true) {
            Socket socket = serverSocket.accept();
            socketList.add(socket);
            new Thread(new ServerThread(socket)).start();
        }
    }

    static class ServerThread implements Runnable {
        Socket socket;

        public ServerThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int len = 0;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(bytes)) != -1) {
                    sb.append(new String(bytes, 0, len, "UTF-8"));
                }
                System.out.println("客户端发送的消息是:" + sb.toString());

                for (Socket s : socketList) {
                    OutputStream outputStream = s.getOutputStream();
                    outputStream.write(sb.toString().getBytes("UTF-8"));
                    outputStream.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码:

public class ChatClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 8080);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好,服务器".getBytes("UTF-8"));
        outputStream.flush();

        while (true) {
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = 0;
            StringBuilder sb = new StringBuilder();
            while ((len = inputStream.read(bytes)) != -1) {
                sb.append(new String(bytes, 0, len, "UTF-8"));
            }
            System.out.println("收到服务器发送的消息:" + sb.toString());
        }
    }
}

总结

本文介绍了如何通过Java实现基于TCP的简单聊天程序。通过例子我们可以学习到TCP协议的特点以及通过Java如何实现Socket通信。同时,聊天程序的实现也涉及到多线程的使用,可以让我们更好地学习多线程的使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实战之基于TCP实现简单聊天程序 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • hibernate5新特性介绍

    Hibernate5新特性介绍 Hibernate是一个流行的Java ORM框架,用于将Java对象映射到关系数据库中。Hibernate5是Hibernate框架的最新版本,引入了许多新特和改进。本文将介绍Hibernate的新特,包括JPA 2.1支持、Java 8日期时间API支持、改进的查询API等。 1. JPA2.1支持 Hibernate5支…

    other 2023年5月8日
    00
  • IP地址的配置以及组网方法

    IP地址的配置以及组网方法攻略 IP地址的配置 IP地址是用于在网络中唯一标识设备的一组数字。在配置IP地址时,需要考虑以下几个步骤: 确定网络类型:首先确定网络类型,是使用IPv4还是IPv6。IPv4是目前广泛使用的版本,而IPv6是新一代的IP协议。 选择IP地址范围:根据网络规模和需求,选择一个合适的IP地址范围。IPv4地址由32位二进制数组成,通…

    other 2023年7月30日
    00
  • C++中头文件和源文件详细介绍

    当我们写C++程序时,一个包含函数或变量声明的头文件和包含实现函数或变量的源文件是非常有用和必要的。在这篇文章中,我们将详细介绍头文件和源文件在C++编程中的作用,以及如何使用它们。 头文件和源文件的作用 头文件是在系统开发中被广泛使用的,在这个文件中写入了函数、类、结构和变量的声明,而源文件则包含实现这些声明的代码。C++中,头文件和源文件的作用如下: 通…

    other 2023年6月27日
    00
  • mybatis-plus之如何实现in嵌套sql

    MyBatis-Plus实现IN嵌套SQL攻略 MyBatis-Plus是一个基于MyBatis的增强工具,提供了更便捷的操作数据库的方式。在MyBatis-Plus中,可以使用嵌套SQL来实现复杂的查询操作,包括IN嵌套SQL。下面是详细的攻略,包含两个示例说明。 示例1:使用IN嵌套SQL查询 假设我们有两个实体类:User和Role,它们之间是多对多的…

    other 2023年7月28日
    00
  • 苹果操作系统详解

    苹果操作系统详解 苹果操作系统是苹果公司开发的、运行于苹果电脑上的操作系统,主要包括macOS和iOS两个版本。macOS是苹果电脑上的操作系统,而iOS则是苹果公司的移动设备操作系统。 macOS操作系统 系统架构 macOS的核心是基于UNIX的Darwin内核。Darwin内核是开源的,因此开发者可以获得内核源代码、自主开发定制版内核。macOS还包括…

    其他 2023年4月16日
    00
  • 基于postman实现http接口测试过程解析

    基于 Postman 实现 HTTP 接口测试过程解析 简介 Postman 是一个非常流行的 API 开发和测试工具,它可以用于在开发 API 的不同阶段进行测试、调试以及文档生成。本文将详细介绍如何使用 Postman 进行 HTTP 接口测试。 准备工作 在使用 Postman 进行接口测试之前,需要准备以下工作: 安装 Postman ,可以从官网上…

    other 2023年6月27日
    00
  • Android自定义控件之电话拨打小键盘

    Android自定义控件之电话拨打小键盘攻略 简介 在Android应用中,我们经常需要实现电话拨打功能。为了提供更好的用户体验,我们可以自定义一个电话拨打小键盘控件,使用户可以方便地输入电话号码。本攻略将详细介绍如何实现这个自定义控件。 步骤 步骤一:创建自定义控件 首先,我们需要创建一个自定义控件来实现电话拨打小键盘。可以创建一个名为DialPadVie…

    other 2023年8月21日
    00
  • mysql的group_concat()函数合并多行数据

    mysql的group_concat()函数合并多行数据 在MySQL中经常会遇到需要将多行数据合并成一行的情况,而MySQL提供了一个非常便捷的函数group_concat()来实现此功能。本文将详细介绍如何使用group_concat()函数来实现将多行数据合并成一行的操作。 group_concat()函数的使用 group_concat()函数可以将…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部