Java Socket实现聊天室附1500行源代码

Java Socket实现聊天室是一种常见的网络应用程序,该应用程序使用Socket API实现了客户端和服务器端之间的连接。本攻略通过讲解如何使用Java Socket API实现一个聊天室,来帮助开发者了解Java Socket编程的基本原理和用法。

概述

Java Socket API是Java语言提供的一个用于网络通信的API,它允许程序员使用Socket、ServerSocket和DatagramSocket等类来实现基于TCP和UDP的网络通信。在本攻略中,我们将使用Java Socket API来开发一个简单的聊天室程序,用户可以通过这个聊天室和其他用户进行交流。

程序设计

客户端

  1. 首先,我们需要创建一个客户端类,该类用于连接到服务器和发送、接收数据。
public class Client {
    private String serverIp;
    private int serverPort;
    private Socket socket;
    private BufferedReader bufferedReader;
    private PrintWriter printWriter;

    public Client(String serverIp, int serverPort) throws IOException {
        this.serverIp = serverIp;
        this.serverPort = serverPort;
        this.socket = new Socket(serverIp, serverPort);
        this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        this.printWriter = new PrintWriter(socket.getOutputStream());
    }

    public void send(String message) {
        printWriter.println(message);
        printWriter.flush();
    }

    public String receive() throws IOException {
        return bufferedReader.readLine();
    }

    public void close() throws IOException {
        socket.close();
    }
}
  1. 然后,我们需要创建一个用于等待用户输入并发送消息的类。
public class WriteThread implements Runnable {
    private Client client;

    public WriteThread(Client client) {
        this.client = client;
    }

    @Override
    public void run() {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String message = scanner.nextLine();
            client.send(message);
        }
    }
}
  1. 接下来,我们需要创建一个用于接收消息的类。
public class ReadThread implements Runnable {
    private Client client;

    public ReadThread(Client client) {
        this.client = client;
    }

    @Override
    public void run() {
        try {
            while (true) {
                String message = client.receive();
                System.out.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 最后,我们将客户端连接到服务器并启动读写线程。
public class ClientMain {
    public static void main(String[] args) throws Exception {
        Client client = new Client("localhost", 8000);

        Thread writeThread = new Thread(new WriteThread(client));
        writeThread.start();

        Thread readThread = new Thread(new ReadThread(client));
        readThread.start();
    }
}

服务器端

  1. 首先,我们需要创建一个服务器类,该类用于等待客户端的连接并处理客户端的请求。
public class Server {
    private int port;
    private Map<String, Socket> socketMap;

    public Server(int port) {
        this.port = port;
        this.socketMap = new HashMap<>();
    }

    public void start() throws IOException {
        ServerSocket serverSocket = new ServerSocket(port);
        while (true) {
            Socket socket = serverSocket.accept();
            String user = UUID.randomUUID().toString();
            socketMap.put(user, socket);
            new Thread(new HandlerThread(user, socket)).start();
        }
    }

    public void send(String user, String message) throws IOException {
        Socket socket = socketMap.get(user);
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
        printWriter.println(message);
    }

    public void broadcast(String message) throws IOException {
        for (Socket socket : socketMap.values()) {
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            printWriter.println(message);
        }
    }

    public void close() throws IOException {
        for (Socket socket : socketMap.values()) {
            socket.close();
        }
    }
}
  1. 然后,我们需要创建一个线程类,该类用于处理客户端的请求。
public class HandlerThread implements Runnable {
    private String user;
    private Socket socket;

    public HandlerThread(String user, Socket socket) {
        this.user = user;
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String message = bufferedReader.readLine();
                if (message.equals("exit")) {
                    socket.close();
                    break;
                }
                ServerMain.server.send(user, message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 最后,我们将服务器端启动。
public class ServerMain {
    public static Server server;

    public static void main(String[] args) throws Exception {
        server = new Server(8000);
        server.start();
    }
}

示例说明

下面给出两个示例说明。

示例一:本地运行

  1. 首先,我们需要打开一个命令行窗口,进入到聊天室程序的源代码目录。

  2. 然后,我们需要启动服务器端程序以等待客户端的连接。

java ServerMain
  1. 接下来,我们需要启动客户端程序以连接到服务器。
java ClientMain
  1. 现在,我们可以在客户端程序中输入消息并发送到服务器端,同时可以在客户端程序中接收其他客户端发送的消息。

示例二:远程运行

  1. 首先,我们需要在远程计算机上启动服务器端程序。
java ServerMain
  1. 然后,我们需要在本地计算机上启动客户端程序并连接到远程服务器。
java ClientMain "server_ip_address"

其中,"server_ip_address"表示远程服务器的公网IP地址。

  1. 现在,我们可以在本地客户端程序中输入消息并发送到远程服务器端,同时可以在本地客户端程序中接收其他客户端发送的消息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Socket实现聊天室附1500行源代码 - Python技术站

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

相关文章

  • 动态JSP页生成静态HTML的方法

    动态JSP页生成静态HTML的方法,通常称为JSP静态化。JSP静态化是指使用JSP页面进行网页制作后,将JSP页面在浏览器访问前,通过指定的技术或者工具,将该JSP页面的内容生成在服务器端,并将具有静态HTML页面的形式的方法。这种方法的主要目的是加速网页的访问速度,缓解服务器压力,提高网站的性能和稳定性。 JSP静态化的过程一般分成三步:1. 编写JSP…

    Java 2023年6月15日
    00
  • 解析spring加载bean流程的方法

    好的!解析 Spring 加载 Bean 的流程是一项非常重要的工作,有助于开发人员更好地理解 Spring 的运作原理。下面是针对该话题的完整攻略,分为以下三个主要部分: 理解 Bean 的概念 在 Spring 中,Bean 是一种对象,是应用程序中主要的构建模块。一般来说,Bean 是由 Spring 容器进行创建、配置和管理的。每个 Bean 都必须…

    Java 2023年5月31日
    00
  • Spring在web.xml中的配置详细介绍

    根据题目的要求,我会给出一个“Spring在web.xml中的配置详细介绍”的完整攻略,包含以下内容: 概述 在web项目中,web.xml是一个非常重要的配置文件,它负责和web服务器打交道,告诉服务器如何处理请求并且将结果返回给客户端。在web.xml中加入Spring的配置信息可以让Spring框架和web服务器配合工作,实现更方便的编写web应用的过…

    Java 2023年6月15日
    00
  • java使用poi导出Excel的方法

    下面是关于”Java使用POI导出Excel的方法”的完整攻略。 简介 POI是Apache基金会的开源项目,可以用Java编写程序生成Microsoft Office文档格式,包括Word、Excel和PowerPoint。POI能够读取和写入Microsoft Office文件的各种属性和内容。在本教程中,我们将学习如何利用POI将数据导出到Excel文…

    Java 2023年5月20日
    00
  • java对数组进行排序的方法

    以下是Java对数组进行排序的方法的完整攻略。 1. Java中的排序方法 Java提供了一系列快速且易用的排序方法,可用于对数组进行排序: Arrays.sort(int[] arr): 对整形数组进行快速排序; Arrays.sort(char[] arr): 对字符数组进行快速排序; Arrays.sort(double[] arr): 对双精度浮点型…

    Java 2023年5月20日
    00
  • 了解java中的session

    了解Java中的Session可以分为以下几个部分: Session是什么? Session在Java Web应用中的作用是什么? 如何在Java Web应用中使用Session? 两个示例说明 Session是什么? Session是指一种在服务器端记录客户端状态的机制。在Web应用中,HTTP协议是一种无状态协议,即服务器无法区分不同请求是否来自同一用户…

    Java 2023年6月15日
    00
  • Java深入理解代码块的使用细节

    Java 深入理解代码块的使用细节 代码块的定义 代码块是指被一对大括号包含起来的代码段,其中包括了定义变量、方法、循环、分支等语句。 Java中的代码块可以分为以下两种: 实例代码块 实例代码块是定义在类中的非静态代码块,可以用于初始化实例变量。实例代码块会在构造方法执行前执行。 实例代码块的示例代码如下: public class Demo { priv…

    Java 2023年5月20日
    00
  • 详解Java中-classpath和路径的使用

    详解Java中-classpath和路径的使用 在Java开发中,我们经常会用到classpath和路径,本篇攻略将详细讲解这两个概念的使用方法,以及它们之间的关系。 classpath的作用 classpath是Java虚拟机(JVM)在搜索class文件时所使用的路径,它可以设置为环境变量,也可以在运行时指定。 设置classpath的环境变量 在Win…

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