java局域网聊天小程序

Java局域网聊天小程序攻略

简介

本攻略介绍如何使用Java编写一个局域网聊天小程序。可以在同一局域网内的多台计算机之间进行聊天。

步骤

1. 创建Java项目

创建一个新的Java项目,命名为“ChatApp”。

2. 添加GUI

在项目中创建一个新的GUI类,命名为“ChatWindow”。在界面中添加一个文本区域用于显示聊天记录,一个文本框用于输入聊天内容,一个按钮用于发送消息。

import javax.swing.*;

public class ChatWindow extends JFrame {
    private JTextArea chatTextArea;
    private JTextField messageTextField;
    private JButton sendButton;

    public ChatWindow() {
        chatTextArea = new JTextArea();
        chatTextArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatTextArea);

        messageTextField = new JTextField();

        sendButton = new JButton("发送");

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
        panel.add(scrollPane);
        panel.add(messageTextField);
        panel.add(sendButton);

        this.add(panel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
}

3. 创建服务器

创建一个新的服务器类,命名为“ChatServer”。在服务器中监听来自客户端的连接请求,并使用多线程处理每个客户端的消息。

示例代码如下:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {
    private ServerSocket serverSocket;
    private List<ClientHandler> clients;

    public ChatServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        clients = new ArrayList<>();
        System.out.println("服务器已启动,正在监听端口 " + port + "...");
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("接收到来自 " + socket.getInetAddress().getHostAddress() + " 的连接请求");
            ClientHandler client = new ClientHandler(socket, this);
            client.start();
            clients.add(client);
            broadcastMessage("系统消息:欢迎 " + client.getUsername() + " 进入聊天室");
        }
    }

    public void removeClient(ClientHandler client) {
        clients.remove(client);
        broadcastMessage("系统消息:" + client.getUsername() + " 离开聊天室");
    }

    public void broadcastMessage(String message) {
        for (ClientHandler client : clients) {
            client.sendMessage(message);
        }
    }

    public static void main(String[] args) throws IOException {
        new ChatServer(8888);
    }
}

4. 创建客户端

创建一个新的客户端类,命名为“ChatClient”。在客户端中连接到服务器,并使用多线程处理消息的接收和发送。

示例代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {
    private String serverHost;
    private int serverPort;
    private Socket socket;
    private BufferedReader reader;
    private PrintWriter writer;
    private ChatWindow chatWindow;

    public ChatClient(String serverHost, int serverPort) throws IOException {
        this.serverHost = serverHost;
        this.serverPort = serverPort;
        socket = new Socket(serverHost, serverPort);
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        writer = new PrintWriter(socket.getOutputStream(), true);
        chatWindow = new ChatWindow();
        chatWindow.setSendButtonActionListener(e -> {
            sendMessage();
        });
        Thread receiveThread = new Thread(() -> {
            try {
                while (true) {
                    String message = reader.readLine();
                    if (message == null) {
                        break;
                    }
                    chatWindow.appendMessage(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        receiveThread.start();
    }

    public void sendMessage() {
        String message = chatWindow.getMessage();
        writer.println(message);
        chatWindow.clearMessage();
    }

    public static void main(String[] args) throws IOException {
        String serverHost = "127.0.0.1";
        int serverPort = 8888;
        new ChatClient(serverHost, serverPort);
    }
}

5. 创建消息处理类

创建一个新的消息处理类,命名为“MessageHandler”。在处理消息时,需要判断消息类型,并将不同类型的消息分别处理。

示例代码如下:

public class MessageHandler {
    private String message;
    private ChatServer chatServer;
    private ClientHandler sender;

    public MessageHandler(String message, ChatServer chatServer, ClientHandler sender) {
        this.message = message;
        this.chatServer = chatServer;
        this.sender = sender;
    }

    public void handle() {
        if (message.startsWith("@")) {
            handlePrivateMessage();
        } else {
            handlePublicMessage();
        }
    }

    private void handlePrivateMessage() {
        int index = message.indexOf(" ");
        if (index == -1) {
            sender.sendMessage("系统消息:私聊消息格式不正确");
            return;
        }
        String receiverName = message.substring(1, index);
        String content = message.substring(index + 1);
        for (ClientHandler client : chatServer.getClients()) {
            if (client.getUsername().equals(receiverName)) {
                client.sendMessage(sender.getUsername() + " 对你说:" + content);
                sender.sendMessage("你对 " + client.getUsername() + " 说:" + content);
                return;
            }
        }
        sender.sendMessage("系统消息:找不到用户 " + receiverName);
    }

    private void handlePublicMessage() {
        chatServer.broadcastMessage(sender.getUsername() + " 说:" + message);
    }
}

6. 创建客户端处理类

创建一个新的客户端处理类,命名为“ClientHandler”。在处理消息时,需要将消息发送给服务器进行转发,并处理服务器发送的消息。

示例代码如下:

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

public class ClientHandler extends Thread {
    private Socket socket;
    private ChatServer chatServer;
    private BufferedReader reader;
    private PrintWriter writer;
    private String username;

    public ClientHandler(Socket socket, ChatServer chatServer) throws IOException {
        this.socket = socket;
        this.chatServer = chatServer;
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        writer = new PrintWriter(socket.getOutputStream(), true);
        username = "Guest" + new Random().nextInt(1000);
        writer.println("系统消息:欢迎你," + username);
    }

    public String getUsername() {
        return username;
    }

    public void sendMessage(String message) {
        writer.println(message);
    }

    @Override
    public void run() {
        try {
            while (true) {
                String message = reader.readLine();
                if (message == null) {
                    break;
                } else {
                    MessageHandler messageHandler = new MessageHandler(message, chatServer, this);
                    messageHandler.handle();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            chatServer.removeClient(this);
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

示例说明

示例一

假设局域网内有三台计算机,分别为“A”、“B”、“C”。执行以下步骤:

  1. 在计算机“A”中启动服务器:
    java
    new ChatServer(8888);
  2. 在计算机“B”中启动客户端:
    java
    new ChatClient("A计算机的IP地址", 8888);
  3. 在计算机“C”中启动客户端:
    java
    new ChatClient("A计算机的IP地址", 8888);
  4. 在客户端“B”中输入一个公共消息:
    Hello, world!
  5. 在客户端“C”中可以看到以下聊天记录:
    A用户:系统消息:欢迎Guest123进入聊天室
    B用户:系统消息:欢迎Guest456进入聊天室
    B用户:B 说:Hello, world!
  6. 在客户端“C”中输入一个公共消息:
    Hi!
  7. 在客户端“B”中可以看到以下聊天记录:
    A用户:系统消息:欢迎Guest123进入聊天室
    B用户:系统消息:欢迎Guest456进入聊天室
    B用户:B 说:Hello, world!
    C用户:C 说:Hi!

示例二

假设局域网内有两台计算机,分别为“D”、“E”。执行以下步骤:

  1. 在计算机“D”中启动服务器:
    java
    new ChatServer(8888);
  2. 在计算机“E”中启动客户端:
    java
    new ChatClient("D计算机的IP地址", 8888);
  3. 在客户端“E”中输入一个私人消息,发送给“D”:
    @Guest123 Hi, D!
  4. 在客户端“D”中可以看到以下聊天记录:
    A用户:系统消息:欢迎Guest123进入聊天室
    D用户:Guest123 对你说:Hi, D!
  5. 在客户端“E”中可以看到以下聊天记录:
    D用户:系统消息:欢迎Guest456进入聊天室

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java局域网聊天小程序 - Python技术站

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

相关文章

  • Springboot 配置SqlSessionFactory方式

    在Spring Boot中,我们可以使用多种方式来配置SqlSessionFactory。以下是两种常见的方式: 1. 使用MyBatis-Spring-Boot-Starter MyBatis-Spring-Boot-Starter是一个官方支持的MyBatis集成Spring Boot的插件,它可以帮助我们快速集成MyBatis和Spring Boot。…

    Java 2023年5月14日
    00
  • Python操作多维数组输出和矩阵运算示例

    Python是一门功能强大的编程语言,拥有许多强大的数学运算工具,其中最重要的便是多维数组和矩阵运算。这篇攻略将会讲解如何在Python中进行多维数组输出和矩阵运算,并提供两个示例说明。 多维数组输出 首先,让我们来看一下多维数组输出的方法。在Python中,可以使用numpy库来创建和操作多维数组。下面是一个简单的例子,展示了如何创建一个二维数组,并将其打…

    Java 2023年5月26日
    00
  • RestTemplate添加HTTPS证书全过程解析

    首先我们来介绍一下RestTemplate,它是Spring Framework的一个类,可以简化HTTP客户端的编程工作。通俗地说,它可以让我们轻松使用Java代码发送HTTP请求,接收响应等操作。但是如果要使用HTTPS协议,则需要添加证书。下面就为大家详细介绍一下添加HTTPS证书的全过程。 第一步:获取证书文件 首先,我们需要获取HTTPS证书的文件…

    Java 2023年5月19日
    00
  • SpringMVC详解如何映射请求数据

    下面我将详细讲解SpringMVC如何映射请求数据的完整攻略。 什么是SpringMVC SpringMVC是一种基于Java的Web框架,它可以帮助我们实现Web应用程序的开发。它是Spring Framework的一部分,专门用于处理Web请求和响应。SpringMVC基于模型-视图-控制器(MVC)架构模式,将应用程序分为模型、视图和控制器三个组件。 …

    Java 2023年6月15日
    00
  • Java窗体动态加载磁盘文件的实现方法

    Java窗体动态加载磁盘文件是一种实现动态性的方法,常见于文件管理系统的开发中。下面给出相关的攻略和两个实例供参考。 准备工作 在实现 Java 窗体动态加载磁盘文件之前,需要进行以下准备工作: 在 Java 中使用 Swing 框架创建一个 JFrame 窗体,用于显示所加载的文件内容。 确认所加载的文件的存放位置,例如文件夹的路径为 “D:\test”,…

    Java 2023年5月20日
    00
  • Java应用服务器之tomcat会话复制集群配置的示例详解

    Java应用服务器之tomcat会话复制集群配置的示例详解 什么是tomcat会话复制集群 在高并发场景下,单台服务器很难完成大量请求的处理,因此很多企业都会将多台服务器组成一个集群,通过负载均衡的方式来分摊请求负载。但是这时候就会遇到一个问题,即如何保证用户在不同服务器之间的会话数据共享。这就需要采用会话复制集群技术,即将用户在一台服务器上的会话数据复制到…

    Java 2023年6月16日
    00
  • Java基础之switch分支结构详解

    Java基础之switch分支结构详解 在Java中,switch分支结构是一种多分支的逻辑结构。相比于if-else语句,它对于多个分支的情况更加简洁易读,是Java程序设计中常用的结构之一。 switch语句的基本格式 switch语句的基本格式如下: switch (expression) { case value1: // case1 code br…

    Java 2023年5月26日
    00
  • 在Java的Struts中判断是否调用AJAX及用拦截器对其优化

    在Java的Struts中,可以通过拦截器对AJAX请求进行优化,以提高系统的性能和用户体验。以下是具体的步骤: 1.在struts.xml配置文件中定义拦截器 <interceptors> <interceptor name="ajaxInterceptor" class="com.example.AjaxI…

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