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日

相关文章

  • bootstrap table使用入门基本用法

    接下来我将详细讲解“bootstrap table使用入门基本用法”的完整攻略。 什么是Bootstrap Table? Bootstrap Table是基于Bootstrap框架开发的一个表格插件,可以方便地创建美观、高度可定制的数据表格。它支持排序、分页、搜索、过滤等常见表格功能,同时也支持自定义样式、事件、单元格渲染等高级功能。 如何使用Bootstr…

    Java 2023年6月15日
    00
  • Spring Boot中使用Spring-data-jpa实现数据库增删查改

    下面是关于“Spring Boot中使用Spring-data-jpa实现数据库增删查改”的完整攻略,包括以下内容: 前置条件 引入依赖 创建实体类 创建Repository接口 使用Repository接口实现数据库的增删查改 示例1:新增数据 示例2:查询数据 1. 前置条件 在使用Spring-data-jpa实现数据库操作之前,需要保证本地环境已经安…

    Java 2023年5月20日
    00
  • Springboot使用Security实现OAuth2授权验证完整过程

    下面我为大家详细讲解Spring boot使用Security实现OAuth2授权验证的完整流程。 1. OAuth2介绍 OAuth2是一种常用的授权框架,可以使得第三方应用程序获得用户的授权才能访问用户的资源。OAuth2的主要授权方式有4种: 1.1 授权码模式(Authorization Code) 授权码模式是OAuth2中最常用的一种模式。其要求…

    Java 2023年5月20日
    00
  • java中用ObjectMapper类实现Json与bean的转换示例

    下面是介绍Java中使用ObjectMapper类实现Json与bean的转换的攻略。 什么是ObjectMapper类 ObjectMapper是Jackson库提供的一个核心类,它负责序列化(将java对象转换为json字符串)和反序列化(将json字符串转换为java对象)功能。以下是ObjectMapper类的基本使用方法。 引入依赖 首先,在项目p…

    Java 2023年5月26日
    00
  • Java如何连接数据库图文教程

    首先我来讲解一下“Java如何连接数据库”的完整攻略。 一、准备工作 1.1 下载并安装数据库 Java程序连接数据库需要先安装对应的数据库软件,这里以MySQL数据库为例。可以在官网 https://dev.mysql.com/downloads/mysql 下载MySQL Community Server安装包(根据系统位数选择),下载后按照提示安装即可…

    Java 2023年5月19日
    00
  • 安装Java时怎么拦截推广软件?

    下面是“安装Java时怎么拦截推广软件”的完整攻略: 1. 下载Java安装程序 首先,我们需要从Oracle官网上下载Java的安装程序,选择适合自己系统的版本,然后双击运行安装程序。 2. 进入安装向导 在开始安装Java之前,系统会询问你是否同意Oracle的许可协议,同意后点击“下一步”按钮。接着你会看到“选择安装选项”界面,我们需要选择“自定义安装…

    Java 2023年5月26日
    00
  • Java完美实现2048小游戏

    Java完美实现2048小游戏攻略 游戏说明 2048是一款益智类小游戏,玩家需要通过上下左右滑动操作,使得相同数字的方块叠加,最终得到2048这个数字的方块。 Java实现方式 Java可以使用Java Swing组件来实现2048小游戏。在Java Swing中,使用JFrame作为主窗口,使用JPanel作为游戏区域,使用JLabel作为每个数字格子的…

    Java 2023年5月19日
    00
  • js动态创建标签示例代码

    动态创建标签是Javascript中常用的技术之一,可以在不改变HTML结构的情况下来改变页面内容,增强用户交互性。以下是JS动态创建标签示例代码的完整攻略: 创建元素 通过 document.createElement(tagName) 方法创建一个HTML元素,tagName是想要创建的元素的标签名,如div、p、span等。 var div = doc…

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