网络多线程——多用户即时通信系统(10)——私聊代码实现

客户端

  1. 接收用户希望给某个其它在线用户聊天的内容。
  2. 将消息构建成 Message 对象,通过对应的 socket 发送给服务器
  3. 在他的线程(通信线程中),读取到发送的 message 消息,并显示即可

服务端

  1. 可以读取到客户端发送给某个客户的消息
  2. 从管理线程的集合中,根据 message 对象的 getterId 获取到对应线程的 socket
  3. 然后将 message 对象转发给指定客户

QQView

在这里插入图片描述

创建 MessageClientService 类,来提供和消息相关的方法



package com.qqclient.service;

import com.qqcommon.Message;

import java.io.ObjectOutputStream;
import java.util.Date;

/**
 * @Author: Gin
 * @Description: 该类提供和消息相关的方法
 * @Modified By: Gin
 * @Date: Created in 15:09 2021/10/19
 */
public class MessageClientService {

    /**
     * @param content  内容
     * @param senderId 发送者
     * @param getterId 接收者
     */
    public void sendMessageToOne(String content, String senderId, String getterId){
        // 构建 Message
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_COMM_MES); // 设置消息类型为普通聊天消息
        message.setSender(senderId);
        message.setGetter(getterId);
        message.setContent(content);
        message.setSendTime(new Date().toString()); // 将时间封装到 message 对象中
        System.out.println(senderId + " 对 " + getterId + " 说:" + content); // 客户端提示信息
        // 将 message 对象发送给服务端
        try {
            ObjectOutputStream oos =
                    new ObjectOutputStream(
                            ManageClientConnectServerThread.getClientConnectServerThread(senderId).
                                    getSocket().getOutputStream());
            oos.writeObject(message);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

}



在 ServerConnectClientThread 类中添加新的分支,还要补充 getSocket() 方法

在这里插入图片描述

在这里插入图片描述



else if(MessageType.MESSAGE_COMM_MES.equals(msg.getMesType())){
                    // 根据 msg 获取 getterId,然后再得到对应线程
                    ServerConnectClientThread serverConnectClientThread
                            = ManageServerConnectClientThread.getServerConnectClientThread(msg.getGetter());
                    // 得到对应 socket 的对象输出流,将 msg 对象转发给指定客户端
                    ObjectOutputStream oos
                            = new ObjectOutputStream(serverConnectClientThread.getSocket().getOutputStream());
                    // 将 msg 发送出去
                    oos.writeObject(msg);
                    // 此处扩展:如果指定客户端不在线,可将信息保存到数据库,以实现离线留言
                }


在 ClientConnectServerThread 类中添加新的分支

在这里插入图片描述



else if(MessageType.MESSAGE_COMM_MES.equals(msg.getMesType())){
                    // 如果消息类型为 普通消息,则把从服务器转发的消息显示到控制台即可
                    System.out.println(msg.getSender() + " 对 " + msg.getGetter() + " 说:" + msg.getContent());
                }


QQView 中调用方法

在这里插入图片描述
在这里插入图片描述

测试:启动服务端,启动三个客户端

服务端:

在这里插入图片描述

客户端1:

在这里插入图片描述

客户端2:

在这里插入图片描述

客户端3:

在这里插入图片描述

.支持联系人状态(在线、离开、离线、忙碌、电话、会议…) .支持会话 .支持邀请多人会话 .支持表情图标 .支持字体与颜色 .支持截图发送 .支持点对点文件发送(Internet上平均传输文件为60KB/秒) .支持点对点文件断点续传 .支持语音交流 .支持视频交流 .查找好友 .显示商务好友信息 .支持消息广播 .留言消息提醒,对方不在线情况下可以留言,对方上线时得到留言提醒 .自定义群组 .自定义个人档案信息 .支持多人语音视频会议 .支持服务器Linux\Win2000\2003\2008 历史信息管理 通讯记录,查看历史聊天记录和文件发送接收记录 短信中心 1)一对一手机短信发送(中国移动、中国联通手机) 2)手机短信群发(中国移动、中国联通手机) Web客户端 内嵌Web网页浏览 语言版本 1)支持简体中文操作界面,包括客户端和服务端 2)支持英文操作界面,包括客户端和服务端 应用领域: 1. 高稳定性,高负载大用户量在线即时通信环境。 2. 面向高端商务,商贸,音乐娱乐各行业门户网站。 3. P2P 互动游戏数据交换. 4. 已有会员整合,"一站式" 服务应用领域。 5. 远程教学,医疗咨询,企业文件传输与管理,视频监控,网络电话等应用。 6. 和企业已有软件项目结合(ERP\CRM\SCM) 已经使用的企业: 上海XXX多媒体技术有限公司、上海XX传媒广告有限、上海XXX网络科技有限公司、青岛XXX软件科技有限公司、外X网、上海XXX服饰有限公司、 广州X打折网 、广州X下载网、北京X房产网、北京X龙旅游信息技术有限公司、北京X网络有限公司... 通讯协议: 1)底层通讯基于TCP/IP协议。 2)文件传输基于UDP协议。Internet中传输文件速度与QQ相当,内网传输文件最快,比QQ快点。 3)客户端之间消息交换基于P2P技术(点对点) 4)应用网络地址转换(NAT)技术,局域网和Internet之间自由通讯. 5)穿透防火墙技术. [找出目标进程] [找出SOCKET句柄] [用DuplicateHandle()函数将其SOCKET转换为能被自己使用] [用转换后的SOCKET进行数据传输] 6)支持邮件接受和发送协议(PoP3/STMP)提供邮件接口,可以在系统内集成邮件系统 开发环境 1)纯VC++、c、Delphi、C#编写 2)支持SQL Server 2000/2005/2008、Oracle9i/10i/MySql数据库 3)服务器系统支持Linux\BSD\Unix\Windows2000\2003\2008 服务器并发说明: 服务端主要用于用户基本信息、在线状态、组织结构的信息保存。 不参与客户之间的信息交换(类似BT),服务器可以为分布式集群,如果数据库为SQL SERVER 2000以上版本可以使用故障转移(负载均衡)大大增强服务端的并发和负载,服务端用户登录数并发为1秒300。 服务器负载说明: 注册用户数量设计上是没有限制的,单服务器情况下允许同时在线用户100000以上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值