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日

相关文章

  • java程序员如何编写更好的单元测试的7个技巧

    下面是针对”Java程序员如何编写更好的单元测试的7个技巧”的一份攻略。 技巧1:拆分单元测试 单元测试应该足够小,以至于一个单元测试只需要测试一个方法或函数。这样使得测试容易重复、快速执行和简单调试。拆分单元测试也使测试更精确,因为每个单元测试只测试一个输入和输出组合。 示例: 以下是一个简单的 Java 类,将两个整数相加并返回结果: public cl…

    Java 2023年5月20日
    00
  • java使用反射给对象属性赋值的两种方法

    当我们需要在运行时使用Java代码来处理类,或者动态地访问和修改类的成员时,反射成为一种非常重要的机制。其中一个反射的应用场景就是给对象属性赋值,在此介绍两种方法。 方法一:使用Class类的getMethod()和setAccessible()方法 首先,需要获得指定的方法,然后再反射到对象上进行调用。下面是一个示例,通过这种方法动态设置User对象的na…

    Java 2023年5月26日
    00
  • SpringBoot整合ip2region实现使用ip监控用户访问城市的详细过程

    下面是整合ip2region实现使用ip监控用户访问城市的详细过程: 步骤一:创建SpringBoot项目 首先,我们需要创建一个SpringBoot项目,可以使用Spring Initializr(https://start.spring.io/)来创建项目。 步骤二:添加依赖 在创建完成后,在pom.xml文件中添加ip2region的Maven依赖: …

    Java 2023年5月19日
    00
  • java开发中如何使用JVisualVM进行性能分析

    完整攻略如下: 1. 什么是JVisualVM JVisualVM是Java SE平台的一个工具,用于监视本地或远程的Java程序运行状态。使用JVisualVM可以实时监控Java程序的内存、CPU、线程等实时状态,同时支持通过插件扩展功能。 2. 如何使用JVisualVM进行性能分析 2.1. 下载并安装JVisualVM JVisualVM是Java…

    Java 2023年5月26日
    00
  • 在jsp页面如何获得url参数

    在JSP页面中,我们可以通过request对象获取URL参数。下面是获取URL参数的完整攻略: 在JSP页面中使用request对象获取URL参数 我们可以通过request.getParameter()方法来获取请求中的特定参数。 示例1: 获取单个参数值 假设我们有一个URL http://www.example.com/index.jsp?name=J…

    Java 2023年6月15日
    00
  • spring boot之使用spring data jpa的自定义sql方式

    下面是使用Spring Data JPA的自定义SQL方式的完整攻略。 1. 添加依赖 首先需要在项目中添加Spring Data JPA的依赖。可以在项目的Maven或Gradle配置中添加以下依赖项: <dependency> <groupId>org.springframework.boot</groupId> &l…

    Java 2023年5月20日
    00
  • JSON创建键值对(key是中文或者数字)方式详解

    下面是关于JSON创建键值对的详细攻略。 1. JSON创建键值对 在JSON中,使用冒号(:)将Key和value分隔开来。Key必须是字符串或者数字。 1.1 Key是字符串 如果Key是字符串,需要将其用引号包围起来,例如: { "name": "小明", "age": 18 } 在以上代码中…

    Java 2023年5月26日
    00
  • Tomca启动闪退问题解决(八大类)

    针对 “Tomcat启动闪退问题” 的解决攻略,我可以提供以下的具体步骤来解决这个问题,该过程中可能包含多个方面的解决方法: 1. 确认Java环境是否正常 首先需要检查Java环境是否正常,在命令行中输入Java -version来查看Java版本是否正确显示。如果没有显示,则需要重新安装并配置Java环境。 2. 检查Tomcat配置 其次需要检查Tom…

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