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日

相关文章

  • 解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    当Spring MVC Controller接收页面传递的中文参数时,可能会出现乱码的问题。为了解决此问题,可以采取以下步骤: 配置过滤器解决POST请求中文乱码问题 在web.xml中添加如下过滤器: <filter> <filter-name>encodingFilter</filter-name> <filte…

    Java 2023年5月20日
    00
  • Ajax实现注册并选择头像后上传功能

    下面我将详细讲解“Ajax实现注册并选择头像后上传功能”的完整攻略。 实现步骤 1. 注册功能 首先,在前端页面中设计一个注册表单,表单中包含必要的字段,例如“用户名”、“密码”、“邮箱”等。当用户填写完表单后,通过Ajax将表单数据提交到后台进行处理。后台需要对用户提交的信息进行验证,例如判断用户名是否已存在、判断邮箱格式是否正确等等。若验证通过,则在后台…

    Java 2023年6月15日
    00
  • Java8时间转换(LocalDateTime)代码实例

    下面我会详细讲解Java8时间转换(LocalDateTime)代码实例的完整攻略。在这个过程中,我会提供两个示例供您参考。 1. 概述 Java8中引入了新的日期类,其中包括了LocalDate和LocalDateTime。在之前的版本中,我们需要使用Calendar类来完成日期的操作,而在Java8中,可以通过LocalDateTime来完成。 Loca…

    Java 2023年5月20日
    00
  • Java按时间梯度实现异步回调接口的方法

    接下来我将详细讲解Java按时间梯度实现异步回调接口的方法的完整攻略,过程中将包含两条示例。 什么是异步回调接口 异步回调接口是一种常用的编程技术,它允许程序在后台执行任务的同时,不会阻塞主线程的进行,并在任务执行完成后异步地通知调用方。异步回调接口在Java中具有广泛的应用,例如在处理网络请求时通常使用异步回调接口来处理异步响应。 实现异步回调的方法 在J…

    Java 2023年5月20日
    00
  • mvn compile报错“程序包com.XXX不存在”

    首先,出现“程序包com.XXX不存在”错误通常是因为Maven没有下载到相关依赖包或者依赖包有误。因此,我们需要进行以下的排错步骤: 检查pom.xml文件,确认相关依赖是否正确引入 首先需要检查项目的pom.xml文件中是否引入了目标依赖包,可以使用以下命令检查pom.xml文件: cat pom.xml |grep com.XXX 如果没有被引入,需要…

    Java 2023年5月19日
    00
  • 微信小程序实现走马灯效果实例

    下面我将为您详细讲解“微信小程序实现走马灯效果实例”的完整攻略,包含以下部分: 项目介绍 预备工作 代码实现 示例说明 项目介绍 在微信小程序中,有一个常用的功能就是走马灯效果,可以用来展示一些动态信息或者广告等内容。本项目将演示如何在微信小程序中实现走马灯效果。 预备工作 在开始本项目之前,您需要准备以下环境和工具: 微信开发者工具 一台可以运行微信开发者…

    Java 2023年5月23日
    00
  • tomcat加载jar异常问题的分析与解决

    下面为大家讲解以下“tomcat加载jar异常问题的分析与解决”的完整攻略。 问题描述 在使用Tomcat启动项目时,可能会遇到以下异常情况: java.lang.NoClassDefFoundError: xxxxxxxxx 问题分析 这个异常通常表示,在Tomcat加载相关的jar包时,出现了问题。具体原因可能是以下几种情况之一: 项目中缺少相关的jar…

    Java 2023年5月19日
    00
  • 浅谈jsp文件和HTML互相引入的乱码问题

    来讲解一下如何解决jsp文件和HTML互相引入的乱码问题。 1. 问题背景 在jsp文件中,我们经常需要嵌入html页面,即在jsp文件中引入html文件。但是在引入的过程中,经常会出现乱码的情况。 比如,在一个jsp文件中引入一个html文件: <%@ page contentType="text/html;charset=UTF-8&qu…

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