Java实现简单局域网聊天室

Java实现简单局域网聊天室攻略

在本文中,我将向您展示如何使用Java语言实现一个简单的局域网聊天室。我们将使用Java的Socket API进行通信。

第一步:创建服务器

我们将从创建服务器开始。服务器将超时等待客户端的连接。一旦客户端连接,服务器将创建一个新的线程对该客户端进行处理。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(5000)) {
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("New client connected");
                ClientHandler clientHandler = new ClientHandler(socket);
                new Thread(clientHandler).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用了Java 7中引入的try-with-resources语句,它可以自动关闭ServerSocket。然后,我们创建一个ServerSocket,并且在一个死循环中等待客户端的连接。一旦有一个客户端连接,服务器就会打印新客户端连接的消息,并且创建一个新的线程(ClientHandler)来处理该客户端的请求。

第二步:创建客户端

接下来,让我们创建一个客户端。客户端将尝试连接到服务器,并且输入来自用户的消息。然后,它将发送该消息到服务器。

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 5000);
             Scanner scanner = new Scanner(System.in);
             PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true)) {

            while (true) {
                System.out.println("Enter message: ");
                String message = scanner.nextLine();
                printWriter.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们首先创建一个Socket对象,该对象将连接到服务器的IP地址和端口号。然后,我们创建一个Scanner对象来读取用户输入的消息,并创建一个PrintWriter对象来将消息发送到服务器。在一个死循环中,我们要求用户输入消息,并将其发送到服务器。

第三步:创建客户端处理程序

在上面的第一步中,我们创建了一个客户端处理程序(ClientHandler)。现在,让我们实现该类。它将负责处理来自客户端的消息,并发送回所有已连接的客户端。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ClientHandler implements Runnable {
    private final Socket socket;
    private final List<PrintWriter> clientPrintWriters;

    public ClientHandler(Socket socket) {
        this.socket = socket;
        this.clientPrintWriters = new ArrayList<>();
    }

    @Override
    public void run() {
        PrintWriter printWriter;
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            printWriter = new PrintWriter(socket.getOutputStream(), true);
            synchronized (clientPrintWriters) {
                clientPrintWriters.add(printWriter);
            }
            String message;
            while ((message = bufferedReader.readLine()) != null) {
                System.out.println("Message received: " + message);
                synchronized (clientPrintWriters) {
                    for (PrintWriter writer : clientPrintWriters) {
                        writer.println(message);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们首先创建一个List对象(clientPrintWriters),该对象将包含该客户端之前连接的所有客户端。然后,我们创建了一个PrintWriter对象,该对象将用于向客户端发送消息,并将其添加到clientPrintWriters

接下来,我们将从BufferedReader中读取来自客户端的消息,然后使用synchronized关键字在访问clientPrintWriters时进行同步。最后,我们将逐一遍历所有已连接的客户端,并将消息发送给它们。

示例:运行客户端和服务器

让我们来看看如何运行客户端和服务器。假设你有两台计算机,分别是192.168.1.1192.168.1.2。在192.168.1.1上运行服务器,而在192.168.1.2上运行客户端。

首先,我们需要编译我们的代码。运行命令javac Server.javajavac Client.java来分别编译服务器和客户端。

然后,在192.168.1.1上运行服务器。运行命令java Server。服务器将开始等待来自客户端的连接。

接下来,在192.168.1.2上运行客户端。运行命令java Client。客户端将尝试连接到服务器,并且要求输入要发送的消息。

在客户端上输入消息,并按回车键。该消息将发送到服务器,并被转发到所有已连接的客户端。

示例:运行多个客户端

您可以在不同的计算机上运行多个客户端。只需在每个客户端上运行相同的java Client命令即可。所有客户端都将连接到同一个服务器,并且可以互相发送消息。

结论

在本文中,我向您展示了如何使用Java语言实现一个简单的局域网聊天室。我们使用了Java的Socket API进行通信,并且在服务器上为每个连接创建了一个单独的线程。虽然这个聊天室很简单,我们可以根据需要添加新的功能以满足您的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现简单局域网聊天室 - Python技术站

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

相关文章

  • Java如何手动创建线程池

    让我详细讲解一下 Java 如何手动创建线程池。 什么是线程池 线程池是一种用于管理线程的方法,它包含了多个线程,可以解决线程频繁创建和删除的问题。在 Java 中,线程池的实现是通过 Executor 框架来完成的。 为什么要手动创建线程池 Java 中提供了许多内置的线程池,如:FixedThreadPool、CachedThreadPool、Sched…

    Java 2023年5月26日
    00
  • Spring Boot集成Thymeleaf模板引擎的完整步骤

    下面是Spring Boot集成Thymeleaf模板引擎的完整步骤,包含两个示例说明。 1. 添加依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta…

    Java 2023年6月15日
    00
  • Java实现学生信息管理系统(使用数据库)

    下面我来详细讲解Java实现学生信息管理系统使用数据库的完整攻略。 思路 实现学生信息管理系统需要考虑以下几个方面: 数据库的设计和建立 Java程序连接数据库 Java程序操作数据库 前端页面的设计和制作 将Java程序和前端页面结合在一起 在这里我们选择使用MYSQL数据库进行操作,使用JDBC连接数据库,采用MVC设计模式来实现程序。 实现步骤 1. …

    Java 2023年5月19日
    00
  • Java 函数式编程梳理

    Java 函数式编程梳理攻略 什么是函数式编程? 函数式编程是一种编程范式,它将计算视为函数的求值。函数式编程强调使用不可变的值和函数,避免使用可变的状态和副作用。 Java 函数式编程的特性 Java 8 是Java中引入函数式编程的版本,通过Java语言的Lambda表达式支持了函数式编程。Java 8中最显著的函数式编程特性如下: Lambda表达式 …

    Java 2023年5月23日
    00
  • springmvc参数为对象,数组的操作

    在SpringMVC中,我们可以将请求参数封装为对象或数组,并在Controller中进行操作。本文将详细讲解SpringMVC参数为对象、数组的操作的完整攻略,包括如何定义请求参数对象、如何使用@RequestParam注解获取请求参数、如何使用@ModelAttribute注解绑定请求参数、如何使用@RequestBody注解获取请求体、如何使用@Req…

    Java 2023年5月18日
    00
  • 深入解析Java的Servlet过滤器的原理及其应用

    深入解析Java的Servlet过滤器的原理及其应用 什么是Servlet过滤器 Servlet过滤器是Java Web开发中常用的一种技术,通过在Web应用中设置过滤器,可以在请求和响应之间添加特定的逻辑。Servlet过滤器可以对请求和响应进行拦截、修改或增强,可以实现对访问控制、安全验证、日志记录、数据压缩等的功能。 Servlet过滤器的工作原理和应…

    Java 2023年6月15日
    00
  • 关于页面刷新,事件重复提交的方法分享

    下面为您详细讲解“关于页面刷新,事件重复提交的方法分享”的完整攻略。 1. 前言 在网站的开发过程中,我们经常会遇到一些问题。其中之一就是重复提交,这种情况的出现是因为用户在提交数据后,可能会因为某些原因选择刷新页面或是重新提交,这会导致数据重复提交或页面出错。为了避免这种问题的发生,我们需要采取一些措施来防止页面刷新和事件重复提交。 2. 防止页面刷新 2…

    Java 2023年6月15日
    00
  • Java的后台文件夹下文件的遍历完整代码

    下面给您详细讲解Java后台文件夹下文件遍历的完整攻略。 一、文件夹遍历基本原理 首先需要一个File对象,用来表示文件夹或文件; 通过该File对象调用listFiles()方法获取该文件夹下的所有子文件或子文件夹; 遍历得到的子文件或子文件夹,如果是文件夹,递归调用自身方法,如果是文件,则可以直接操作。 二、Java后台文件夹遍历完整代码 import …

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