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日

相关文章

  • jsp中调用java代码小结

    下面我会给出一个完整的“jsp中调用java代码”的攻略,分为以下几个步骤: 一、创建Java类及方法在Java中创建一个类,并在其中定义一个或多个方法,以便供JSP调用。类及方法应当按照Java语法规范编写,并尽量遵循业内最佳实践的要求。 二、打包Java类为jar包将Java类打包成jar包,然后将jar包放置到WEB-INF/lib目录下。这样JSP页…

    Java 2023年5月23日
    00
  • springboot+springJdbc+postgresql 实现多数据源的配置

    实现多数据源的配置通常需要以下几个步骤: 引入相关依赖 配置多个数据源 配置对应的JdbcTemplate 使用不同的数据源来操作数据库 以下是具体的步骤和代码示例: 引入相关依赖 在项目中引入以下依赖: <dependency> <groupId>org.springframework.boot</groupId> &l…

    Java 2023年6月16日
    00
  • 基于java实现的ECC加密算法示例

    题目中提到了“基于java实现的ECC加密算法示例”,因此我们需要对这个话题展开讲解,下面是详细的攻略: 什么是ECC加密算法? ECC(Elliptic Curve Cryptography)椭圆曲线加密算法,是在椭圆曲线上实现的加密算法。通常情况下,比如RSA加密算法,密钥长度越长,加密的强度也越强。但是,ECC加密算法却有一个比较特别的地方,那就是在密…

    Java 2023年5月19日
    00
  • Java实现字符数组全排列的方法

    下面是Java实现字符数组全排列的方法的完整攻略: 步骤1:定义一个递归函数 首先,我们需要使用递归来实现字符数组的全排列。定义一个递归函数,函数的参数包括要排列的字符数组arr、开始交换的索引位置start以及结束的索引位置end。 public static void permutation(char[] arr, int start, int end)…

    Java 2023年5月26日
    00
  • Springboot 整合maven插口调用maven release plugin实现一键打包功能

    下面是详细的Spring Boot整合Maven插件调用Maven Release Plugin实现一键打包功能的攻略: 1. 确定依赖和插件 首先确保在pom.xml文件中引入了Maven Release Plugin和Maven Deploy Plugin: <project> <build> <plugins> &l…

    Java 2023年6月2日
    00
  • 详解Java编程中包package的内容与包对象的规范

    Java编程中的包(package)是为了更好地组织类而产生的概念,它可以将同一类别或功能的类文件存放在同一包目录下,使用时只需要import相应包的类即可。在Java编程中,包的定义需要遵循一定的规范。 包的定义规范 定义包名时,使用小写字母(包名不要与类名相同); 将包的名字写在Java源文件的顶部; 多个单词组成包名时,使用”.”分割,例如com.co…

    Java 2023年5月26日
    00
  • java控制台输出版多人聊天室

    Java控制台输出版多人聊天室是一种基于Java的多用户聊天程序,可以让多个用户在同一时间内进行聊天并且可以同时发送和接收消息。以下是一些步骤和示例,可以让您快速了解该聊天室的使用方法。 步骤: Step 1:编写代码 首先,需要编写Java代码来创建多人聊天室。这个过程可能相对复杂,涉及到网络编程以及多线程处理等知识点。因此,您可以参考其他开源项目或教程来…

    Java 2023年5月26日
    00
  • 快速了解hibernate配置文件与映射文件

    下面是“快速了解hibernate配置文件与映射文件”的完整攻略。 配置文件 Hibernate的配置文件是一个XML文件,用于定义与数据库的连接信息和系统级其他配置信息。在 hibernate.cfg.xml 文件中,您可以指定以下信息: 数据库连接属性(例如数据库URL,用户名,密码) Hibernate的驱动程序类和其他配置设置 数据库方言,用于在查询…

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