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日

相关文章

  • HTML5 图片预加载的示例代码

    下面我就来详细讲解一下“HTML5 图片预加载的示例代码”的完整攻略。 什么是图片预加载? 在网页中,图片通常都会比较大,当用户访问网页时可能会造成页面加载缓慢,甚至出现一段时间的空白,不利于用户体验。为了改善这种情况,我们可以通过预加载图片的方式,在页面完全加载之前,把图片提前加载,保证图片的立刻展现,提高用户体验。 如何实现图片预加载? 第一种方法:使用…

    other 2023年6月25日
    00
  • Android Studio实现简单计算器功能

    Android Studio实现简单计算器功能攻略 1. 创建新项目 首先,在Android Studio中创建一个新的项目。选择\”Empty Activity\”模板,并为项目命名。 2. 布局设计 在res/layout目录下的activity_main.xml文件中,使用XML布局设计计算器的界面。可以使用LinearLayout或者GridLayo…

    other 2023年9月7日
    00
  • [Asp.Net Core]提高开发效率的方法

    提高开发效率的方法 在Asp.Net Core开发中,有一些方法可以帮助提高开发效率。下面是一些可以考虑的方法和示例说明: 1. 使用代码生成工具 代码生成工具可以帮助自动生成重复性的代码,减少手动编写的工作量。一个常用的代码生成工具是Scaffolding,它可以根据数据库模型自动生成控制器、视图和数据访问层代码。 示例说明: dotnet aspnet-…

    other 2023年7月27日
    00
  • win10商店又抽风不能下载应用程序 试试这四种方法

    以下是详细的攻略: 问题描述 在使用Windows 10操作系统时,有时会遇到Win10商店不能正常下载应用程序的情况。这种问题可能会出现在新安装Windows 10的系统上,也可能在已经运行一段时间的系统上。出现这种问题往往让人十分苦恼,无法使用商店的功能。但是,也不必过于担心,这种问题其实有很多种解决方法。下面我们就来详细讲解一下如何解决Win10商店不…

    other 2023年6月25日
    00
  • ora-01722:无效数字的解决方法

    ORA-01722:无效数字的解决方法 在Oracle数据库中,我们有时会遇到错误代码ORA-01722,该错误消息通常会提示“无效数字”。这种错误可能会导致系统崩溃或数据丢失,因此我们需要了解它的原因和解决方法。 原因 此错误通常是由以下原因引起的: 数据类型不匹配:例如,您尝试将字符值插入整数列,或者将日期值插入字符串列中。 格式错误:您尝试将不正确格式…

    其他 2023年3月29日
    00
  • windows下使用vscode搭建golang环境并调试的过程

    下面就给大家介绍一下windows下使用vscode搭建golang环境并调试的过程的完整攻略。 环境搭建 安装Golang 首先,我们需要在官网(https://golang.org/dl/)下载golang的安装包并进行安装。安装完成后,可以在命令行中输入go version,若成功打印出版本号,则说明安装成功。 安装VSCode 接着,我们需要在官网(…

    other 2023年6月27日
    00
  • Win11右键不能刷新怎么办?Win11使用注册表将右键刷新调出来方法

    下面是Win11右键不能刷新怎么办的完整攻略。 问题描述 在Win11系统中,有些用户遇到了右键菜单中没有刷新选项的问题。这种情况下,如果需要刷新一下当前窗口,就需要通过其他方式来解决,比如按下F5键或者通过菜单栏的“视图”-“刷新”命令来刷新。 如果你也遇到了这个问题,下面的方法可以帮助你将“刷新”选项加入到右键菜单中。 解决方法 方法一:通过注册表设置 …

    other 2023年6月27日
    00
  • 纯css多种方法实现div中单行文字、多行文字及嵌套div垂直水平居中

    纯CSS多种方法实现div中单行文字、多行文字及嵌套div垂直水平居中攻略 在本攻略中,我将介绍多种纯CSS的方法来实现以下布局需求: 单行文字在div中水平居中。 多行文字在div中水平垂直居中。 嵌套div在父div中水平垂直居中。 单行文字在div中水平居中 要实现单行文字在div中水平居中,可以使用以下CSS样式: div { display: fl…

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