Java实现多线程聊天室

实现多线程聊天室,在Java中可以通过使用Socket和Thread来实现。

具体步骤如下:

1.创建服务器端
- 创建ServerSocket对象,并设置端口号
- 创建Socket对象,以接受客户端请求
- 使用Thread创建一个线程,以接受客户端发来的消息,并将消息广播给其他客户端
- 使用ArrayList存储客户端(每个客户端都对应一个Socket对象)
- 使用while循环,以接受客户端请求并处理

示例1:

下面是创建线程的示例代码。

public class ChatServer {

    private ArrayList clientList = new ArrayList();
    private ServerSocket serverSocket;

    public void start() {
        try {
            serverSocket = new ServerSocket(1024);
            System.out.println("server start...");
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("accept client:" + socket.getInetAddress());
                ChatHandler handler = new ChatHandler(socket, clientList);
                new Thread(handler).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ChatHandler implements Runnable {

    private Socket socket;

    private BufferedReader reader;
    private PrintWriter writer;
    private ArrayList clientList;

    public ChatHandler(Socket socket, ArrayList clientList) {
        this.socket = socket;
        this.clientList = clientList;
        try {
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            String line;
            while ((line = reader.readLine()) != null) {
                broadcast(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void broadcast(String msg) {
        for (int i = 0; i < clientList.size(); i++) {
            Socket s = (Socket) clientList.get(i);
            if (s != this.socket) {
                try {
                    PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
                    pw.println(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

示例2:

下面是客户端实现的示例代码。

public class ChatClient extends JFrame {

    private JTextArea msgarea = new JTextArea();
    private JTextField msginput = new JTextField();
    private JButton btn = new JButton("发送");

    private PrintWriter pw;

    public ChatClient() {
        init();
        connect();
    }

    private void init() {
        this.setSize(400, 400);
        this.setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        JScrollPane sp = new JScrollPane(msgarea);
        msgarea.setEditable(false);
        this.add(sp, BorderLayout.CENTER);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new BorderLayout());
        bottomPanel.add(msginput, BorderLayout.CENTER);
        bottomPanel.add(btn, BorderLayout.EAST);
        this.add(bottomPanel, BorderLayout.SOUTH);
        btn.addActionListener(e -> {
            String msg = msginput.getText();
            pw.println(msg);
            msginput.setText("");
        });
    }

    private void connect() {
        try {
            Socket socket = new Socket("localhost", 1024);
            pw = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            new Thread(() -> {
                String line;
                try {
                    while ((line = br.readLine()) != null) {
                        msgarea.append(line + "\n");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new ChatClient().setVisible(true);
    }
}

至此,Java实现多线程聊天室的完整攻略就讲解完了。如果你想了解更多关于Java多线程编程,可以参考Java的官方文档或者相关教程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现多线程聊天室 - Python技术站

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

相关文章

  • js写的评论分页(还不错)

    下面是详细的攻略: 1. 了解分页的原理 在进行评论分页之前,需要先了解分页的原理。一般来说,分页是将较大的数据集合分割成多个部分进行显示,以便用户能够更方便地浏览和查找内容。分页通常包括以下几个要素: 总记录数(total):数据集合的总条数。 每页记录数(pageSize):每页显示的的数据条数。 当前页数(currentPage):当前显示的页码。 总…

    Java 2023年6月16日
    00
  • 如何查看Java字节码?

    当我们编写Java代码并使用编译器将其编译为字节码文件后,我们有时需要查看生成的字节码以便于了解程序实际执行的内容。下面是查看Java字节码的步骤: 第一步:编译java文件为字节码文件 在终端或命令行界面中进入Java源代码所在目录,使用javac命令将java源文件编译为字节码文件。例如: javac HelloWorld.java 完成后会在当前目录下…

    Java 2023年5月11日
    00
  • java实现输入输出流代码分享

    下面就来为您详细讲解一下关于Java 实现输入输出流的攻略及代码分享。 什么是Java输入输出流? Java输入输出流主要是用于从文件、内存、网络等数据源中读取数据、写入数据到数据目的地的机制。在Java中,输入输出操作使用stream(流)完成。流可以被简单地定义为一组字节,这些字节可以是自硬件设备中读取的,或者是从文件、内存、网络连接等其他源中读取的。 …

    Java 2023年5月19日
    00
  • Spring Boot整合Web项目常用功能详解

    下面我给你详细讲解SpringBoot整合Web项目常用功能的完整攻略: 一、概述 SpringBoot是一种可以简化Spring应用程序的创建和开发过程的框架。在Web应用程序中,常见的功能包括:前端页面开发、路由、数据接收和处理、数据持久化等。SpringBoot在这些方面均提供了相应的支持和优化,能够让Web应用的开发更加高效和方便。 二、常用功能 1…

    Java 2023年5月15日
    00
  • 图文详解Java的反射机制

    图文详解Java的反射机制 什么是反射机制 Java中的一个重要概念就是反射机制。简单的来说,反射机制是指在运行时动态地获取类的信息以及使用类的信息的能力。通过反射,我们可以在运行时获取类的属性、方法、构造函数等信息,并且可以在运行时动态地进行类的实例化等操作。有了这些能力,我们可以更加灵活地使用Java编写程序。 反射机制的基本用法 获取类对象 我们首先需…

    Java 2023年5月26日
    00
  • JAVA读取文件夹大小的几种方法实例

    下面是针对“JAVA读取文件夹大小的几种方法实例”的完整攻略。 一、问题概述 在开发Java应用程序中,我们难免会遇到计算文件夹大小的需求。那么,在Java中,我们有哪些方法来获取文件夹的大小呢?本文将为大家详细介绍Java中获取文件夹大小的几种方法。 二、方法一:使用File类 我们可以使用Java自带的File类获取文件夹的大小,具体步骤如下: 创建一个…

    Java 2023年5月20日
    00
  • JavaWeb乱码问题的终极解决方案(推荐)

    JavaWeb乱码问题的终极解决方案 问题描述 在JavaWeb开发过程中,经常会遇到乱码问题。例如,使用post方式提交中文数据时,后台接收到的数据却是乱码。 这个问题的根本原因是因为编解码不一致,导致前端提交的数据在后端被解析时出现了乱码。 解决方案 解决这个问题的终极解决方案,是将全站都使用UTF-8编解码。这包括了Java代码和Web页面都需要使用U…

    Java 2023年5月20日
    00
  • 双亲委派模型如何保证类加载的安全性?

    双亲委派模型是Java中的一种类加载机制,它通过优先使用父类加载器来加载类,从而保证了类加载的顺序和安全性。在Java应用程序中,通常会涉及多个类及其加载器,因此采用双亲委派模型是很有必要的。下面我们将详细讲解该模型如何保证类加载的安全性,包括以下几个方面: 一、双亲委派模型的原理 1.1 类加载器的层次结构 在Java中,类加载器以一种层次结构的形式呈现。…

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