java控制台实现聊天程序

要实现Java控制台的聊天程序,需要用到Socket编程以及多线程编程。

以下为实现步骤:

步骤一:建立连接

在客户端和服务端之间建立连接需要使用Socket编程。在客户端中创建一个Socket对象,指定连接的IP地址和端口号,然后发送连接请求。在服务端中创建一个ServerSocket对象,并指定端口号,然后等待客户端的连接请求,如果有客户端请求连接,则建立连接成功。

步骤二:实现多线程

一个聊天程序需要同时接收和发送消息,因此需要实现多线程。在客户端和服务端中,分别创建接收消息和发送消息的线程。如果有消息需要发送,则将消息放入消息队列中,由发送消息的线程取出并发送。如果有消息需要接收,则接收线程接收服务器发送过来的消息。

步骤三:实现聊天功能

当客户端和服务端之间建立连接后,客户端通过控制台输入发送的消息,服务端接收到消息后,将消息发送给所有连接的客户端,实现聊天功能。

以下为示例说明:

示例一:客户端代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
    private String serverIp; // 服务端IP地址
    private int port; // 服务端端口号
    private Socket socket;
    private BufferedReader br;
    private PrintWriter pw;

    public Client(String serverIp, int port) {
        this.serverIp = serverIp;
        this.port = port;
    }

    // 连接服务端
    public void connect() {
        try {
            socket = new Socket(serverIp, port);
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
            new Thread(new ReceiveMsgThread()).start();
            new Thread(new SendMsgThread()).start();
            System.out.println("连接成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 发送消息
    public void sendMsg(String msg) {
        pw.println(msg);
    }

    // 接收消息线程
    class ReceiveMsgThread implements Runnable {
        @Override
        public void run() {
            try {
                String msg = "";
                while ((msg = br.readLine()) != null) {
                    System.out.println("收到消息:" + msg.trim());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }   
        }
    }

    // 发送消息线程
    class SendMsgThread implements Runnable {
        @Override
        public void run() {
            try {
                BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
                String input = "";
                while ((input = console.readLine()) != null) {
                    pw.println(input);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
    }

    public static void main(String[] args) {
        Client client = new Client("127.0.0.1", 8888);
        client.connect();
    }
}

示例二:服务端代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    private int port; // 监听的端口号
    private ServerSocket serverSocket;
    private List<ClientThread> clients = new ArrayList<ClientThread>();

    public Server(int port) {
        this.port = port;
    }

    // 启动服务端
    public void start() {
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("服务端启动成功,监听端口:" + port);
            while (true) {
                Socket socket = serverSocket.accept();
                ClientThread clientThread = new ClientThread(socket);
                clients.add(clientThread);
                clientThread.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 广播消息
    public void broadcast(String msg) {
        for (ClientThread clientThread : clients) {
            clientThread.sendMsg(msg);
        }
    }

    // 客户端线程
    class ClientThread extends Thread {
        private Socket socket;
        private BufferedReader br;
        private PrintWriter pw;

        public ClientThread(Socket socket) {
            this.socket = socket;
            try {
                br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 发送消息
        public void sendMsg(String msg) {
            pw.println(msg);
        }

        // 接收消息
        public void run() {
            try {
                String input = "";
                while ((input = br.readLine()) != null) {
                    // 广播消息
                    broadcast(input);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 客户端退出后移除客户端线程
                clients.remove(this);
                try {
                    if (socket != null) {
                        socket.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        Server server = new Server(8888);
        server.start();
    }
}

以上为实现Java控制台聊天程序的完整攻略,其中还包含了示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java控制台实现聊天程序 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • Springboot多数据源配置之整合dynamic-datasource方式

    Springboot多数据源配置之整合dynamic-datasource方式 在实际的应用开发中,我们往往需要连接多个数据库来存储不同的数据,而Springboot提供了多种方式来实现多数据源配置,其中一种方便易用的方式就是使用dynamic-datasource这个开源的库。 本文将介绍如何使用dynamic-datasource来配置Springboo…

    Java 2023年5月20日
    00
  • Java实战之课程信息管理系统的实现

    Java实战之课程信息管理系统的实现 项目简介 课程信息管理系统是一个简单的管理应用程序,它可以帮助学生和教师管理课程信息,包括课程的添加、查询、修改、删除等操作。该系统采用Java语言进行开发,具有良好的可拓展性和易维护性,可以运行在各种平台上。 开发环境 Java SE Development Kit 8 (JDK 8) Eclipse IDE MySQ…

    Java 2023年5月23日
    00
  • java中stringBuilder的用法详解

    下面就为大家详细讲解“java中StringBuilder的用法详解”的完整攻略。 什么是StringBuilder 在Java中,StringBuilder是一个可以修改的字符串,提供了很多操作字符串的方法,比如添加字符、插入字符、删除字符等。StringBuilder和String之间最大的不同是StringBuilder是可变的,而String是不可变…

    Java 2023年5月26日
    00
  • Java中数组的创建与传参方法(学习小结)

    下面我将详细讲解“Java中数组的创建与传参方法(学习小结)”的完整攻略。 一、Java中数组的创建 Java中数组是一组同类型数据元素的集合。数组中的每个元素可以通过索引来访问,索引从0开始,到数组长度减1为止。 1.1 声明数组 声明数组需要指定数组的类型和数组名。语法格式如下: type[] arrayName; 例如,声明一个整型数组 variabl…

    Java 2023年5月26日
    00
  • SpringBoot 导出数据生成excel文件返回方式

    准备工作 首先,我们需要在项目的依赖文件中添加对poi-ooxml的依赖,这样我们才能够在Java中读写Excel文件。 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <ver…

    Java 2023年5月19日
    00
  • apache commons工具集代码详解

    Apache Commons工具集代码详解 什么是Apache Commons Apache Commons是Apache软件基金会提供的一套开源工具集,用于Java开发。它提供了许多实用的Java类和组件,可以帮助开发者快速开发各种应用程序,提高开发效率。 Apache Commons的组件 Apache Commons工具集包含了很多组件,每个组件都提供…

    Java 2023年5月19日
    00
  • UniApp + SpringBoot 实现微信支付和退款功能

    UniApp 是一款跨平台的移动应用开发框架,通常可同时构建出 iOS 和 Android 应用。SpringBoot 是一款流行的 Java Web 开发框架,提供了快速搭建 web 应用的能力。通过结合起来,可以实现微信支付和退款功能。 第一步:注册微信开发者账号 如果没有微信开发者账号,需要手动注册一个。注册成功后,需要进行微信支付相关的配置,包括商户…

    Java 2023年5月23日
    00
  • Java正则表达式的实例操作指南

    Java正则表达式的实例操作指南 正则表达式是一种强大的工具,可以在Java中用于查找和替换字符串。本文将详细介绍如何在Java中使用正则表达式进行字符串操作。 什么是正则表达式 正则表达式是一种用于描述字符串模式的工具。它可以用来查找匹配模式的字符串,检查字符串是否符合模式,或者用特定的方式替换字符串。 在Java中,我们可以使用java.util.reg…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部