Java Socket+多线程实现多人聊天室功能

下面我们逐步讲解如何利用Java Socket和多线程实现多人聊天室功能:

1.建立Socket连接

首先,需要建立服务端和客户端的Socket连接。服务端需要绑定一个端口,等待客户端连接,而客户端则需要提供服务端的IP地址和端口号来连接服务端。

服务端代码示例:

public static void main(String[] args){
    try {
        ServerSocket serverSocket = new ServerSocket(port); //绑定端口
        while (true) {
            Socket socket = serverSocket.accept(); //等待客户端连接
            //新建一个线程处理客户端请求
            Thread thread = new Thread(new ServerThread(socket));
            thread.start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

客户端代码示例:

public static void main(String[] args){
    try {
        Socket socket = new Socket(host, port); //连接服务端
        //新建一个线程接收服务器消息
        Thread thread = new Thread(new ClientThread(socket));
        thread.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.多线程处理客户端请求

当客户端与服务端建立连接后,服务端需要针对每一个连接新建一个线程来处理客户端的请求,这样可以实现多个客户端同时聊天的功能。客户端也需要开启一个线程来接收服务端发送来的消息。

服务端代码示例:

public class ServerThread implements Runnable {
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), "UTF-8"));
            String line;
            while ((line = reader.readLine()) != null) {
                //处理客户端请求 如广播消息等
            }
            //客户端断开连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码示例:

public class ClientThread implements Runnable {
    private Socket socket;

    public ClientThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), "UTF-8"));
            String line;
            while ((line = reader.readLine()) != null) {
                //接收服务端消息
            }
            //服务端断开连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.实现聊天室功能

在服务端维护一个客户端列表,当客户端连接时,将其加入列表中。当有客户端发送消息时,服务端遍历列表,向所有客户端发送消息,实现聊天室的功能。

服务端代码示例:

public static List<Socket> socketList = new ArrayList<>();

public void addSocket(Socket socket){
    socketList.add(socket);
}

public void removeSocket(Socket socket){
    socketList.remove(socket);
}

public void sendMessage(String message){
    for(Socket socket:socketList){
        try {
            PrintWriter writer = new PrintWriter(
                    new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true);
            writer.println(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ServerThread中,需要将新的连接加入客户端列表中,处理客户端请求时,广播客户端发送的消息。

public void run() {
    try {
        //将新连接加入客户端列表
        server.addSocket(socket);
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream(), "UTF-8"));
        String line;
        while ((line = reader.readLine()) != null) {
            //处理广播消息,向所有客户端发送
            server.sendMessage(line);
        }
        //从客户端列表中移除断开的连接
        server.removeSocket(socket);
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

客户端在开启线程接收服务端消息后,可以通过写入控制台的方式发送消息给服务端。

public void run() {
    try {
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream(), "UTF-8"));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println("收到消息:" + line);
        }
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

至此,我们就完成了使用Java Socket和多线程实现的多人聊天室功能。

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

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

相关文章

  • Java 多线程之间共享数据

    下面是关于Java多线程之间共享数据的完整攻略: 理解多线程共享数据的概念 多个线程同时对同一份数据进行读写操作时,就会发生数据共享的问题。而这种数据共享会带来一系列的问题,如不一致、竞态条件等。因此在多线程编程中,必须了解数据共享的问题,并采取一些方式来解决它。 解决数据共享的方式 1. 同步控制 同步控制是一种方式,通过它我们可以实现对共享数据的访问控制…

    多线程 2023年5月17日
    00
  • golang基于errgroup实现并发调用的方法

    Golang基于errgroup实现并发调用的方法 在Golang中,errgroup是一个非常好用的并发控制库,它允许我们创建一组goroutine并发执行一系列的任务并监控它们的运行情况。本文将介绍如何使用errgroup实现并发调用的方法。 一、准备工作 在使用errgroup前,我们需要先引入它的包: import "golang.org/…

    多线程 2023年5月17日
    00
  • 关于python并发编程中的协程

    关于Python并发编程中的协程,以下是一个完整攻略: 什么是协程 协程是一种轻量级的线程,它可以在同一进程内同时运行多个协程,并且在协程中可以通过“挂起”和“恢复”操作来实现非阻塞式的并发编程。 协程的实现 在Python3.5版本以后,Python引入了asyncio关键字来对协程实现进行支持。 使用async、await关键字定义协程函数,并且使用as…

    多线程 2023年5月17日
    00
  • 在apache下限制每个虚拟主机的并发数!!!!

    在 Apache 下限制每个虚拟主机的并发数可以通过修改 Apache 的配置文件实现。具体步骤如下: 打开 Apache 的配置文件 httpd.conf,找到以下两行内容: #LoadModule status_module modules/mod_status.so #ExtendedStatus On 取消注释并保存,使得服务器状态模块加载并开启扩展…

    多线程 2023年5月17日
    00
  • php session的锁和并发

    让我们来详细讲解下面的问题:“php session的锁和并发”: 什么是php session? PHP Session是一个Web开发中常用的会话机制,用于在服务器和浏览器之间跟踪用户。 在会话期间,可以将所有与该用户相关的信息存储在其会话中,而不必在每次请求时都需要重复登录和授权。 PHP Session的锁机制 PHP Session采用了文件锁机制…

    多线程 2023年5月16日
    00
  • Java高并发BlockingQueue重要的实现类详解

    Java高并发BlockingQueue重要的实现类详解 概述 在Java中,BlockingQueue是一种很重要的线程安全容器,它提供了线程安全的数据存储和获取操作,用于在多线程并发场景中实现生产者-消费者模式的应用。本文将详细介绍BlockingQueue的相关实现类,包括ArrayBlockingQueue、LinkedBlockingQueue、S…

    多线程 2023年5月16日
    00
  • C#如何对多线程、多任务管理(demo)

    我们来详细讲解C#如何对多线程、多任务进行管理的攻略。 C#多线程管理 在C#中,可以使用System.Threading命名空间中的类来实现对多线程的管理。其中比较常用到的类有Thread、ThreadPool和Task等。 Thread类 Thread类是用于创建新的线程的主要类之一。我们可以使用Thread类的静态方法来创建线程。其中,最常用的方法是T…

    多线程 2023年5月16日
    00
  • Go语言中的并发goroutine底层原理

    Go语言中的并发goroutine底层原理 背景 Go语言被称为互联网时代的C语言,因为它具有高效的并发能力,支持使用轻量级的goroutine进行并发编程。在Go语言中,每个goroutine都代表着一个独立的线程,但是它们可以在同一时间运行且共享内存,因此能够实现高效的并发编程。 goroutine的实现原理 Go语言的goroutine是基于M:N线程…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部