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日

相关文章

  • 解决netty中spring对象注入失败的问题

    解决Netty中Spring对象注入失败的问题,一般存在两个方面的问题: 在Netty的handler中无法注入Spring的bean; 在Netty的线程中使用Spring的事务管理器会出现异常报错。 为了解决这两个问题,我们需要按照以下步骤进行: 步骤一:引入spring-boot-starter-netty 在Spring Boot项目中,通过添加sp…

    Java 2023年6月16日
    00
  • Springboot工具类StringUtils使用教程

    下面我将为你详细讲解Spring Boot工具类StringUtils的使用教程。 1. StringUtils的介绍 StringUtils是Spring Framework框架中的一个工具类,提供了一系列方便实用的字符串操作方法,如判断普通字符串或者集合是否为空,字符串拼接、截取等等,大大简化了开发人员在字符串操作时的繁琐操作,提高了开发效率。 2. S…

    Java 2023年5月19日
    00
  • java对象序列化操作实例分析

    Java对象序列化操作 简介 Java对象序列化是指将Java对象转换为字节流,以便于数据传输、持久化和分布式应用等场景下的使用。其作用是将Java对象序列化为数据流方便在网络间传输或在本地存储,以及反序列化操作使其还原为Java对象。 序列化对象 对于待序列化的Java对象,需要实现 Serializable 接口。以下是一个示例: import java…

    Java 2023年5月26日
    00
  • java实现计算器功能

    Java是一种高级编程语言,通过使用Java代码可以实现计算器的功能。下面是实现计算器功能的详细攻略: 1. 设计思路 要实现计算器的功能,需要考虑以下问题: 如何获取用户的输入; 如何进行计算; 如何将计算结果输出给用户。 解决以上问题,我们可以设计一个基本的计算器功能,并将其分为三个部分: 一个界面,用于显示计算器的操作和计算结果; 一个模块,用于读取用…

    Java 2023年5月18日
    00
  • jsp实现Servlet文件下载的方法

    实现Servlet文件下载可以通过JSP页面的form表单提交或通过Servlet的输出流方式进行,下面分别进行讲解。 通过JSP页面的form表单提交下载文件 在JSP页面中添加form表单,设置action为需要下载文件的Servlet路径。 “`html 下载文件 “` 其中,fileName为要下载文件的文件名。 在Servlet中获取要下载的文…

    Java 2023年6月15日
    00
  • 教你开发脚手架集成Spring Boot Actuator监控的详细过程

    我会为您详细讲解开发脚手架集成Spring Boot Actuator监控的详细过程。 1. 什么是脚手架 脚手架(Scaffolding)是一种生成框架或代码骨架的工具,目的是让开发人员可以从简单的模板开始,集中精力编写业务逻辑和特定应用场景的代码。通过脚手架开发,可以极大地提高开发效率,并且在团队协作开发中更加便捷。 2. 为什么要集成Spring Bo…

    Java 2023年5月20日
    00
  • Java父线程(或是主线程)等待所有子线程退出的实例

    Java父线程(或是主线程)等待所有子线程退出的实例,可以通过使用Thread的join()方法实现。 join()方法的功能是等待该线程执行结束,即阻塞等待该线程结束,然后再继续执行下面的代码。我们可以利用该方法等待所有子线程执行结束,从而达到等待所有子线程退出的目的。 下面是一个完整的示例代码: public class MainThread { pub…

    Java 2023年5月19日
    00
  • 别在Java代码里乱打日志了,这才是正确的打日志姿势

    这里是关于正确打印日志的攻略: 1. 什么是好的日志? 一个好的日志应该包含以下几个方面: 表现良好 日志输出应有较好的可读性; 日志输出要具有一定层次性; 日志输出要有一定格式化,比如在同一业务中输出的日志应当保持一致性。 提供足够的信息 日志应当详细描述应用发生了什么,以及发生原因; 一些需要排查的问题,还可以在日志中给出一些额外的信息或态度。 不只是输…

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