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日

相关文章

  • 剑灵6月30日万物有灵版本预下载指南 预下载地址教程介绍

    剑灵6月30日万物有灵版本预下载指南 1. 简介 剑灵是一款热门的多人在线角色扮演游戏,而6月30日的万物有灵版本是一次重要的更新。为了避免更新当天服务器过载,官方提供了预下载的选项,让玩家在更新当天能够快速进入游戏。本指南将详细介绍预下载的步骤和预下载地址。 2. 预下载步骤 步骤一:访问官方网站 首先,打开你的浏览器,访问剑灵的官方网站。你可以在搜索引擎…

    other 2023年8月4日
    00
  • SpringBoot整合WebService服务的实现代码

    下面是 SpringBoot 整合 WebService 服务的实现代码的完整攻略。 1. 添加 WebService 相关依赖 在 pom.xml 中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…

    other 2023年6月27日
    00
  • Java使用嵌套循环模拟ATM机取款业务操作示例

    Java使用嵌套循环模拟ATM机取款业务操作示例攻略 本攻略将详细讲解如何使用Java编写一个模拟ATM机取款业务操作的示例程序。在这个示例中,我们将使用嵌套循环来模拟ATM机的交互过程。 步骤一:创建一个ATM类 首先,我们需要创建一个名为ATM的Java类,用于模拟ATM机的行为。在这个类中,我们将定义ATM机的初始余额和一些方法来处理取款操作。 pub…

    other 2023年7月28日
    00
  • mongodb的projection

    MongoDB的Projection的完整攻略 在MongoDB中,Projection是一种查询选项,用于指定要返回的文档中包含或排除哪些字段。本文将介绍MongoDB的Projection的使用方法和常用选项,包括两个示说明。 MongoDB的Projection的使用方法 在MongoDB中,Projection可以通过在查询中添加一个对象来指定。下面…

    other 2023年5月9日
    00
  • vue插槽slot的理解和使用方法

    Vue插槽(Slot)的理解和使用方法 Vue插槽(Slot)是Vue.js框架中一种强大的组件化技术,它允许我们在组件中定义一些可替换的内容,以便在使用组件时动态地插入内容。插槽使得组件更加灵活和可复用,能够适应不同的使用场景。 插槽的基本概念 插槽可以理解为组件的占位符,用于接收父组件传递的内容,并将其渲染到组件的特定位置。通过插槽,我们可以在组件内部定…

    other 2023年8月20日
    00
  • Openssl实现双向认证教程(附服务端客户端代码)

    OpenSSL实现双向认证教程 此教程将指导如何使用OpenSSL实现双向认证,包含服务端与客户端代码。在本教程中,我们将学习: 什么是双向认证 生成RSA密钥对 生成自签名的根证书 生成服务器证书请求(CSR) 生成服务器证书 配置服务端 生成客户端证书请求(CSR) 生成客户端证书 配置客户端 测试双向认证 什么是双向认证 在SSL/TLS连接中,通常只…

    other 2023年6月27日
    00
  • Sysbench对Mysql进行基准测试过程解析

    当然,下面是关于Sysbench对MySQL进行基准测试的完整攻略,包含两个示例说明: Sysbench基准测试过程解析 步骤1:安装Sysbench 首先,确保您已经安装了Sysbench工具。您可以通过以下命令在Linux系统上安装Sysbench: sudo apt-get install sysbench 步骤2:创建测试数据库 在MySQL中创建一…

    other 2023年10月17日
    00
  • Vue自定义v-has指令实现按钮权限判断

    Vue自定义指令可以帮助我们封装业务逻辑,实现更好的代码复用和可维护性。本文将详细介绍如何通过自定义指令实现按钮权限判断。 1. 创建指令 首先我们需要创建一个自定义指令,用于检查当前用户是否有权限操作某个按钮。我们可以将这个指令命名为v-has: Vue.directive(‘has’, { inserted (el, binding) { const {…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部