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. 现在,我们可以在本地客户端程序中输入消息并发送到远程服务器端,同时可以在本地客户端程序中接收其他客户端发送的消息。
阅读剩余 78%

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

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

相关文章

  • JAVA复制数组和重置数组大小操作

    JAVA复制数组操作 1. System.arraycopy() 该方法可以用来复制一个数组到另一个数组。 语法: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组 srcPos:源数组起始位置 dest:目标数…

    Java 2023年5月26日
    00
  • Spring MVC+FastJson+hibernate-validator整合的完整实例教程

    下面我将详细讲解Spring MVC+FastJson+hibernate-validator整合的完整实例教程。 一、概述 Spring MVC是一种用于Web开发的基于Java的MVC框架,可以方便地搭建Web应用。FastJson是阿里巴巴的一款开源的JSON处理库,相对于其他JSON处理库,FastJson有着更快的速度和更好的压缩率。hiberna…

    Java 2023年5月20日
    00
  • java睡眠排序算法示例实现

    Java睡眠排序算法示例实现是一种非常特殊的排序算法,它通过将数组中每个元素对应的线程让其进入睡眠状态,进而实现了对数组内元素的排序。下面我将详细介绍Java睡眠排序算法的完整攻略,并附上两个示例,希望对您有所帮助。 Java睡眠排序算法的基本原理 Java睡眠排序算法的基本原理是,对于一个包含n个元素的待排序数组,我们可以创建n个线程,每个线程对应数组中的…

    Java 2023年5月19日
    00
  • java 输入一个数字,反转输出这个数字的值(实现方法)

    针对这个问题,我会给出一个详细的解答: 题目描述 编写Java程序,输入一个数字,反转输出这个数字的值。 思路分析 将输入的数字转化为字符串类型。 将字符串类型的数字转化为字符数组类型。 通过for循环反转字符数组。 将反转后的字符数组转化成字符串类型,并将其转化为数字类型。 输出转化后的数字。 代码实现 import java.util.Scanner; …

    Java 2023年5月26日
    00
  • SpringBoot详解整合Spring Cache实现Redis缓存流程

    让我来详细讲解一下“SpringBoot详解整合Spring Cache实现Redis缓存流程”的完整攻略。 1. Spring Cache 简介 Spring Cache 是 Spring 官方提供的缓存框架,它通过提供 CacheManager 统一管理缓存和缓存操作,屏蔽了不同缓存框架的差异,使得我们只需要处理统一缓存接口即可,极大地降低了使用缓存的难…

    Java 2023年6月15日
    00
  • Java常用字符串工具类 字符串智能截取(3)

    Java常用字符串工具类 字符串智能截取(3) 引言 在Java开发中,字符串操作是我们最为常见的操作之一。字符串截取是字符串操作的重要之一。常规的字符串截取是通过String类的substring()方法来实现的。然而,当我们需要截取的字符串位置不确定时,怎么办?本篇文章将为大家介绍如何使用Java字符串智能截取工具类,满足大家的需求。 字符串智能截取 字…

    Java 2023年5月26日
    00
  • PHP生成随机码的思路与方法实例探索

    PHP生成随机码的思路与方法实例探索 前言 在实际开发中,我们常常需要用到随机码,比如生成验证码、生成邀请码等等。PHP提供了多种方法可以生成随机码,本文将对几种常用的方法进行探究和讲解。 常用随机码生成方法 1. rand函数 rand($min, $max) 函数可以用来生成指定范围内的随机整数。 $code = rand(100000, 999999)…

    Java 2023年5月26日
    00
  • SpringSecurity自定义登录界面

    在这里我将为您详细讲解SpringSecurity如何自定义登录界面的完整攻略。 1. SpringSecurity简介 SpringSecurity是一个基于Spring框架的安全管理框架,它提供了一套完整的安全控制方案,可以用于Web应用程序和企业级应用程序。 SpringSecurity包括认证(Authentication)、授权(Authoriza…

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