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日

相关文章

  • 深入理解 Python 中的多线程 新手必看

    深入理解 Python 中的多线程 本文主要介绍 Python 中的多线程编程相关知识,内容涉及如下: 什么是多线程 Python 中的线程模块 Python 中的 GIL 问题 Python 中的多线程编程示例 什么是多线程 多线程是指同时执行多个线程,例如 Word 中同时打字和拼写检查。多线程可以提高程序的性能和响应速度,因为线程可以在程序等待 IO …

    多线程 2023年5月17日
    00
  • Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

    首先,Redis的单线程模型指的是在一个进程中只有一个IO线程对外提供服务,并且在处理命令时会使用单个CPU核心进行工作,这样会减少锁竞争、避免线程切换等导致的性能损耗,同时也提高了Redis的稳定性。 然而,Redis在处理某些操作时,如大规模的集合运算、多个客户端的并发操作等,单线程模型下的性能并不如预期。所以,Redis在3.0版本以后引入了多线程技术…

    多线程 2023年5月17日
    00
  • java高并发ThreadPoolExecutor类解析线程池执行流程

    Java高并发ThreadPoolExecutor类解析线程池执行流程 什么是线程池? 线程池是用于动态管理线程创建、销毁的线程组件,试图减少线程创建、销毁开销、使线程复用以提高并发性能的一种机制。线程池中有一个线程队列,用于存放等待执行的任务。线程池创建的线程数通常取决于处理器的内核数,或者是按照实际情况动态调整。 Java中提供了ThreadPoolEx…

    多线程 2023年5月17日
    00
  • Linux并发执行很简单,这么做就对了

    作为一个网站作者,我非常乐意为你详细讲解“Linux并发执行很简单,这么做就对了”这个主题。 一、什么是并发执行? 并发执行指的是多个任务在同一时间段内同时运行。在计算机系统中,它通常用于提高程序的运行效率,优化资源利用率和缩短执行时间,可以有效地提高系统的性能。 二、如何在Linux中进行并发执行? 在Linux中,实现并发执行通常有以下几种方法: 1. …

    多线程 2023年5月16日
    00
  • python并发2之使用asyncio处理并发

    使用asyncio处理并发主要是通过协程和事件循环来实现,下面是使用asyncio处理并发的完整攻略。 1. 理解asyncio asyncio是python的一个异步IO库,可以提高IO操作的效率,同时支持并发编程模型。asyncio本质上是一个事件循环框架,它提供了Task、Future和协程等机制来实现异步处理和协作式多任务,可以避免因阻塞IO而导致的…

    多线程 2023年5月16日
    00
  • Java并发之串行线程池实例解析

    Java并发之串行线程池实例解析 什么是串行线程池? 串行线程池指的是只会使用一个线程进行处理的线程池。通过将所有需要执行的任务提交到该线程池,可以确保只使用一个线程执行处理,从而保证了任务的顺序性。 为什么需要串行线程池? 在某些业务场景下,任务之间的顺序很重要,比如文件上传、邮件发送等。如果使用普通线程池,由于任务都是并行执行的,就无法保证任务的顺序性,…

    多线程 2023年5月16日
    00
  • python3爬虫中多线程进行解锁操作实例

    下面是详细讲解“python3爬虫中多线程进行解锁操作实例”的完整攻略。 1.什么是多线程 多线程是指同时执行多个线程。多线程能够很好地提高程序的效率,因为在程序执行过程中,如果发生了耗时的操作,比如等待用户输入、文件读写操作、网络数据的传输等,传统的程序会一直等待,造成CPU资源的浪费。而使用多线程可以使得这些操作在后台进行,不会阻塞主线程,提高了程序的响…

    多线程 2023年5月16日
    00
  • Java基础之多线程

    Java多线程的基础知识 在 Java 编程中,多线程是非常常见的技术,多线程的使用可以在提高程序并发性能的同时,也增加了程序的复杂度,因此学好多线程技术对于 Java 开发人员来说是非常重要的。 1. 创建线程 在 Java 中创建一个线程有两种主要方法: 1.1. 实现 Runnable 接口 Runnable 接口是 Java 多线程中的一个基本接口,…

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