Java聊天室之实现客户端一对一聊天功能

实现Java聊天室中的一对一聊天功能,需要涉及到客户端和服务器端的编写。

1. 设计思路

客户端与服务器端之间需要建立起TCP连接,首先需要在客户端上实现一个发送和接收消息的模块,与此同时,需要在服务器端上能够接收到客户端发送的消息,再将其转发给目标用户。

设计思路如下:

  1. 客户端输入目标用户的用户名
  2. 通过TCP连接,向服务器端发送一条消息,告知服务器需要与目标用户建立一对一聊天的连接
  3. 服务器接收到消息后,将其转发给目标用户
  4. 目标用户接收到消息后,向服务器端回复消息
  5. 服务器接收到回复消息后,再将其转发给发起连接的用户

2. 客户端实现

客户端需要实现一个发送和接受消息的模块,示例如下:

public class Client {

    // 初始化socket
    private Socket socket;

    // 初始化输入输出流
    private BufferedReader in;
    private PrintWriter out;

    // 连接服务器
    public void connect() {
        try {
            socket = new Socket("localhost", 9999);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 发送消息
    public void sendMessage(String message) {
        out.println(message);
    }

    // 接收消息
    public String receiveMessage() {
        try {
            return in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

在建立与服务器的连接后,通过sendMessage()方法向服务器发送一条消息,告知服务器需要和目标用户开始一对一聊天的连接。示例如下:

Client client = new Client();
client.connect();
client.sendMessage("connect:user1");

这条消息的格式为“connect:用户名”,服务器需要根据这个信息,判断目标用户是否在线,如果在线,则建立起一对一连接。

3. 服务器端实现

服务器需要实现一个消息转发的模块,示例如下:

public class Server {

    // 初始化socket和用户列表
    private ServerSocket server;
    private List<Client> clients = new ArrayList<>();

    // 监听端口
    public void start() {
        try {
            server = new ServerSocket(9999);
            System.out.println("Server started on port 9999");

            // 监听客户端连接
            while (true) {
                Socket socket = server.accept();
                Client client = new Client(socket, this);
                clients.add(client);
                client.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 客户端向服务器发送消息
    public void receiveMessage(Client client, String message) {
        if (message.startsWith("connect:")) {
            String username = message.substring(8);

            // 遍历用户列表
            for (Client c : clients) {
                if (c != client && c.getUsername() != null && 
                    c.getUsername().equals(username)) {
                    // 将消息转发给目标用户
                    client.sendMessage("Connected to " + username);
                    c.sendMessage(client.getUsername() + " connected to you");
                    System.out.println(client.getUsername() + " connected to " + username);
                    return;
                }
            }
            // 如果目标用户不在线,发送错误消息
            client.sendMessage(username + " is not online");
        } else {
            // 将消息转发给目标用户
            String username = message.substring(0, message.indexOf(":"));
            String msg = message.substring(message.indexOf(":") + 1);
            for (Client c : clients) {
                if (c.getUsername() != null && c.getUsername().equals(username)) {
                    c.sendMessage(client.getUsername() + ": " + msg);
                    return;
                }
            }
            // 如果目标用户不在线,发送错误消息
            client.sendMessage(username + " is not online");
        }
    }

    // 客户端退出
    public void removeClient(Client client) {
        clients.remove(client);
        System.out.println(client.getUsername() + " is offline");
    }

    // 启动服务器
    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
}

这个模块实现了对用户发来的消息的接收和转发功能,其中receiveMessage()方法实现了发送消息的逻辑,通过判断消息类型,将消息转发给目标用户。

4. 总结

通过以上的Demo,可以实现Java聊天室中的一对一聊天功能。主要实现思路是,在客户端与服务器建立连接之后,确定目标用户并告知服务器,从而触发服务器进行消息转发。在实际应用中,可以根据需要进行改进,例如增加好友列表、聊天记录等功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java聊天室之实现客户端一对一聊天功能 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • dropload.js插件下拉刷新和上拉加载使用详解

    我们来详细讲解一下“dropload.js插件下拉刷新和上拉加载使用详解”的完整攻略。 简介 Dropload.js是一款移动端网页下拉刷新和上拉加载的插件,它可以很方便地帮助我们实现下拉刷新和上拉加载的功能。下面我们来详细讲解一下这个插件的使用方法。 安装和引入 首先,我们需要将dropload.js插件引入到网页中,可以直接下载js文件,也可以使用CDN…

    other 2023年6月25日
    00
  • finaldraft(专业剧本编辑器)

    以下是关于“Final Draft(专业剧本编辑器)”的完整攻略,过程中包含两个示例。 背景 Final Draft是一款专业的剧本编辑器,广泛用于电影、电视、戏剧等领域。提了许多功能,如自动格式化、场景管理、角色管理、剧本分析等。本攻略将介绍如何使用Final Draft进行本创作。 基本理 使用Final Draft进行剧本创作,我们需要完成以下步骤: …

    other 2023年5月9日
    00
  • 浅析在 RHEL8 配置静态 IP 地址的不同方法

    浅析在 RHEL8 配置静态 IP 地址的不同方法 在 RHEL8 中,有多种方法可以配置静态 IP 地址。下面将详细介绍两种常用的方法,并提供示例说明。 方法一:使用 Network Manager 打开终端并以 root 用户身份登录。 使用以下命令编辑 Network Manager 配置文件: vi /etc/sysconfig/network-sc…

    other 2023年7月31日
    00
  • 全局设置fetchcredentials

    全局设置fetch.credentials 在JavaScript中,fetch()方法用于发送网络请求并获取响应。fetch()方法提供了许多选项,可以通过设置选项来控制请求和响应的行为。其中,fetch.credentials选项用于控制请求发送凭据(如cookie和HTTP认证信息)。 fetch.credentials选项 fetch.credent…

    other 2023年5月7日
    00
  • java、js中实现无限层级的树形结构方法(类似递归)

    实现无限层级的树形结构可以采用递归的方式。以下是Java和JavaScript各一种实现方法。 Java实现方法 定义树节点类 首先需要定义一个树节点类,用于表示树中的节点。 public class TreeNode { private String id; private String name; private String parentId; pri…

    other 2023年6月27日
    00
  • Win10创意者怎么自定义页面 Win10创意者一键清爽操作方法

    Win10创意者怎么自定义页面 Win10创意者更新后,用户可以自定义页面,增强个人化体验。具体步骤如下: 步骤一:打开“设置”页面 在桌面任务栏左下角点击“开始”菜单,选择“设置”图标。 步骤二:进入“个性化”页面 在“设置”页面中,点击“个性化”选项。 步骤三:选择“主题”设置 在“个性化”页面中,点击“主题”选项。 步骤四:通过“自定义”进行页面设置 …

    other 2023年6月25日
    00
  • 高性能MySQL(第三版)

    高性能MySQL(第三版) MySQL是世界上最流行的关系型数据库管理系统之一,应用非常广泛。对于大型和高负载的应用程序来说,性能是非常重要的。《高性能MySQL(第三版)》是一本非常有价值的书,本文将介绍这本书的一些亮点。 作者与内容介绍 《高性能MySQL(第三版)》由三位作者撰写:Baron Schwartz、Peter Zaitsev和Vadim T…

    其他 2023年3月28日
    00
  • 详解Java中类的加载与其初始化

    详解Java中类的加载与其初始化 Java虚拟机在运行Java程序的时候,会先将程序中所有需要用到的类加载进内存。而类的加载并不仅仅指从磁盘读取class文件并转化为二进制码,还包括链接、初始化等操作。本文会对Java中类的加载、连接、初始化过程进行详细阐述,并通过两条示例进行说明。 类的加载 类的加载通常在Java程序运行过程中进行,加载的方式有以下几种:…

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