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日

相关文章

  • Servlet实现简单的用户登录功能实例代码

    下面我就为你介绍一下如何用Servlet实现简单的用户登录功能实例代码的攻略。 一、创建JavaWeb工程 首先,我们需要创建一个JavaWeb工程。你可以选择Eclipse或者Intellij IDEA等开发工具来创建新的JavaWeb工程。并在项目中添加相关的Servlet包。 二、创建登录页面 在Web应用程序中添加一个HTML页面作为登录页面(log…

    Java 2023年6月15日
    00
  • JavaEE实现文件下载

    下面我来为您详细讲解JavaEE实现文件下载的完整攻略。 什么是文件下载 文件下载是指用户从计算机或网络中下载文件的过程。 在Web应用中,文件下载常见于用户需要下载某个文件,例如: PDF格式的文件 Word文档 Excel表格 图片文件(JPG、PNG等) 视频文件(MP4、AVI等) 压缩文件(ZIP、RAR等) JavaEE实现文件下载的过程 Jav…

    Java 2023年5月20日
    00
  • spring实现bean对象创建代码详解

    Spring实现Bean对象创建代码详解 在Spring框架中,我们可以使用XML配置文件、注解、Java Config等方式定义Bean对象,而Spring容器则提供了默认的Bean对象创建方式。本文将详细讲解Spring实现Bean对象创建的代码流程和具体实现步骤。 1. Bean对象定义 在Spring中,我们通常使用XML文件定义Bean对象,XML…

    Java 2023年5月26日
    00
  • javaweb实现文件上传与下载功能

    请看以下内容: javaweb实现文件上传与下载功能攻略 1. 上传功能的实现 1.1 前端的实现 上传功能需要用户选择文件,并将文件发送到后台。我们可以通过HTML表单及其相关API来实现此功能。以下是一段HTML代码片段,用于实现文件上传输入框: <form action="/upload" method="post&…

    Java 2023年5月20日
    00
  • Spring Boot详解创建和运行基础流程

    Spring Boot是一个轻量级的Java开发框架,可以快速构建可独立运行的Spring应用程序,使得Spring应用程序的开发变得更加容易、更加快捷。下面是Spring Boot创建和运行基础流程的详细攻略。 创建Spring Boot项目 创建Spring Boot项目的最简单的方法是通过Spring官网提供的 Spring Initializr,该工…

    Java 2023年5月19日
    00
  • IDEA 如何导入别人的javaweb项目进行部署

    下面是在 IDEA 中导入别人的 JavaWeb 项目并进行部署的详细攻略: 步骤1:下载并安装 IDEA 如果您还没有安装 IDEA,可以到 IntelliJ IDEA 官网下载对应版本并安装。安装过程中请按照提示一步一步操作即可。 步骤2:下载并解压缩 JavaWeb 项目 假设您已经获得了别人的 JavaWeb 项目源代码,接下来需要将其解压缩到本地。…

    Java 2023年6月2日
    00
  • Java面试题冲刺第四天–数据库

    Java面试题冲刺第四天–数据库攻略 数据库是Java开发中非常重要的一部分,因此数据库相关的面试题也是面试中的重点部分。下面将从数据库的知识点、常见面试题以及解答方法等方面进行介绍。 一、数据库的知识点 数据库的分类:关系型数据库(RDBMS)和非关系型数据库(NoSQL)。 常用的关系型数据库:MySQL、Oracle、SQL Server等。 常用的…

    Java 2023年5月19日
    00
  • 纯JSP实现的简单登录示例

    下面是“纯JSP实现的简单登录示例”的完整攻略: 1. 准备工作 首先需要创建一个简单的web应用程序。在该程序的根目录下创建一个名为“login.jsp”的文件,用于用户登录。 2. 页面设计 下面来设计程序的页面。在login.jsp文件中,创建一个表单以便用户输入用户名和密码: <form name="loginform" m…

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