Ĭ��
���� �������� 2
�뿪��IM������Ʒ�¿ӣ�����3���¹����ҿ�Դ����ߣ������������·��... ��վ�����㽨��
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ
΢��ɨһɨ��ע��

��������С���磬ԭ�⡰ʹ��DDD+Netty������һ���ֲ�ʽIM(��ʱͨ��)ϵͳ����Ϊ�������Ķ����飬��ʱͨѶ���д����޶��͸Ķ�����лԭ���ߡ�


0��ϵ������



* ���º���NEXT��IM����Դ��ѧϰ������ԴIM��������HarmonyChat�����ں���NEXT��WebSocketЭ������

1����������


���������̵�ѧϰ���ܲ��ܰ�֪ʶѧ���֣��������Ƕ���ʵ�������ұ�д�������У�����������ʵ��������֤����Ϊ�����������������ݡ�

��С�Ҿ�ϲ�����֣�����һ����ʱͨ�ŵ���ĿΪ�����Ѿ����ڲ�ͬ��������ʵ����5��6�Σ�����Ϊ��ʵ����������ͼ���¡�

����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_1.jpg

������ͼ������

  • 1����Щ�Ǹ�ѧ��Socket��Swing��ʱ�����붯��������Щ�����ܲ���д��QQ������
  • 2��Ҳ�е�����Ϊʵϰ��ѵ��Ҫ���ɵ���Ŀ������������һЩ��������һ��ʱ������д��ȫ�����ܣ�
  • 3����Ȼ��Щ��Ŀ�����ڿ���ȥ���dz����Ľ��棬�Լ������߼�����Ҳ������ô���ơ�������ѧϰ�׶ε�ÿһ��ʵ���У�����Ϊ�Լ������ܶ༼���ϵijɳ���

��ô�����ν豾�ĵĻ��ᣬ��IMʵ���Ļ��������㣬ϣ�������õ��ϡ�

�����������ݣ��һ�Ϊ���������ο���һ��IM�ķ������棬����ϵͳ�ܹ���ͨ��Э�顢����Ⱥ�ġ����鷢�͡�UI�¼������ȣ��Լ�ȫ�׵�ʵ��Դ��������������ѧϰ��

ע��Դ���ڱ��ġ�4������Դ����һ�ڵĸ�������������

������ͬ�������ڡ���ʱͨѶ����Ȧ�����ںţ���ӭ��ע�����ں��ϵ������ǣ����˽�����

2��֪ʶ׼��


* ��Ҫ��ʾ�����IJ���һƪ��ʱͨѶ�������£���������ȫ����ʵս������֯�������������Լ�ʱͨѶ��IM�����������˽���̫�٣���������ϸ�Ķ�������������һƪ�͹������㿪���ƶ���IM����

�������˲�֪�� Netty ��ʲô�������򵥽����£�

Netty ��һ�� Java ��Դ���ܡ�Netty �ṩ�첽�ġ��¼�����������Ӧ�ó������ܺ͹��ߣ����Կ��ٿ��������ܡ��߿ɿ��Ե������������Ϳͻ��˳�����
Ҳ����˵��Netty ��һ������ NIO �Ŀͻ����������˱��̿��ܣ�ʹ��Netty ����ȷ�������ٺͼ򵥵Ŀ�����һ������Ӧ�ã�����ʵ����ij��Э���Ŀͻ���������Ӧ�á�
Netty �൱�򻯺����߻�������Ӧ�õı��̿������̣����磬TCP �� UDP �� Socket ���񿪷���


�����Ǽ�ƪ�й�Netty���������£�ֵ��һ����


��������Java��NIO����֪����ʲô�����������½������ȶ�һ�£�


NettyԴ����API�������Ķ���ַ��


3��������


�ڿ�ʼѧϰ֮ǰ���ȸ�������ʾ�±�������Դ��������Ч����Դ���ڱ��ġ�4������Դ����һ�ڵĸ���������������

����ҳ�棺
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_2.png

���Ӻ��ѣ�
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_3.png

��Ϣ���ѣ�
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_3-2.png

4������Դ��


�����������븽�����أ�
NaiveChat-master(52im.net).zip (5.11 MB , ���ش���: 303 , �ۼ�: 1 ����)

Դ����Ŀ¼�ṹ������ͼ��ʾ��
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_3-3.png

���� IM ������Ϊ������ģ�飺UI���ͻ��ˡ������ˡ�

֮�����������֣���Ϊ�˽�UIչʾ��ҵ���߼����룬ʹ���¼��ͽӿڽ����������ô������θ��Ӹɾ�����������չ��ά����

��ģ�������ã������������£�
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_3-4.jpg

5��ϵͳ����


������IM�У������˲���DDD������������ģʽ���д���� Netty �Ĺ��ܽ��� SpringBoot ������ͣ���ƣ�ͬʱ�ڷ����˴����̨���Էdz������IJ���ͨ��ϵͳ�������û���ͨ�Ź������ڿͻ��˵Ľ����ϲ���UI�����ķ�ʽ���д���Ա�֤ҵ��������UIչʾ���룬�����dz�������չ�Ŀ��ơ�

���⣬�ڹ���ʵ���ϰ�������������΢���������ͻ��ˡ���¼���������Ӻ��ѡ��û�ͨ�š�Ⱥ��ͨ�š����鷢�͵Ⱥ��Ĺ��ܡ������ж���ʵ����Ҫʹ�õĹ��ܣ����԰�������ϵͳ���ܽ�����չ��

����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_4.png

����һ�£�

  • 1��UI������ʹ��JavaFx��Maven�UI���湤�̣��𲽽�����¼���塢�������塢�Ի��򡢺������ȸ���UIչʾ�������¼���
  • 2���ܹ�������ʹ��DDD�����������Ƶ��IJ�ģ�ͽṹ��Netty����ʹ�ã��ܹ��������ķֲ����ܣ���Ӧ�������ܵ����ƣ���
  • 3������ʵ������������¼�����Ӻ��ѡ��Ի�֪ͨ����Ϣ���͡����������ȸ���ܡ�

6��UI����


6.1���ܻ���


���촰�壬�����ڵ�½������˵�����촰�������ݻ��Ƚ϶࣬ͬʱҲ�����Ը���һЩ��

��ͼ�����촰���Ĺ��ܶ�����ͼ��
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_5.jpg

����ͼ��ʾ��

  • 1���������������������������Ķ��壬��һ���հ����壬��ȥ��Ĭ�ϵı߿���ť (��С�����˳���)��
  • 2��֮���������������������dz�֮Ϊ���� Bar������������ʵ�֣�
  • 3���������Ӵ����¼�����������ťʱ�任 �������� �е�������Ϣ��

6.2��������


�Ի���ѡ�к�����������չ�֣�Ҳ�����û�֮����Ϣ���ͺ�չ�֡�

�������Ͽ�����һ�������Ĺ��̣����������ĶԻ����û����Ҳ�������Ӧ���ݵ����䡣��ô�Ҳ౻�����Ի��б� ListView ��Ҫ��ÿһ���Ի��û����������������û���ʱ������ͨ�������л������Ĺ��̡�Ч������ͼ��ʾ��

����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_6.jpg

�μ���ͼ���ҽ���һ�£�

  • 1������������ÿһ���Ի����壬�Ҳ��������������ݼ���֮�仯��ͬʱ������Ӧ�ĶԻ�����Ҳ��Ҳ�仯����
  • 2���Ի���������չʾ���ѷ��͵���Ϣ���Ҳ�չʾ���˷��͵���Ϣ��ͬʱ��Ϣ���ݻ��������ݵ����������Ӹ߶ȺͿ��ȣ���
  • 3�����������ı����������ں�����ʵ���������ı����������ù��õķ�ʽ�������ƣ���Ȼ��Ҳ��������Ϊ�����ĸ���ʹ�á�

6.3�����б�


���Ҷ�����ʹ�� PC �˵�΢�ţ�����֪���ں��������Ƿ��˼������ݵģ����а������µ����ѡ����ںš�Ⱥ�����������ĺ��ѣ����ܻ�������ͼ����

����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_7.jpg

�μ���ͼ���ҽ���һ�£�

  • 1�����������������ⲿ�����ݲ��䣬��ǰ����һ��������Ŀǰʹ�õķ�ʽ�� fxml ���ƣ������ⲿ����ͨ�ù��ܣ����Գ�ȡ�����ŵ������У����Ƴ�һ������Ԫ���ࣻ
  • 2���������ǵķ�������ʹ�� JavaFx ��������Ϊ�����£��ⲿ����һ��Ƕ�� ListView��Ҳ�������ײ���������һ�� ListView�����Ѻ�Ⱥ���и���һ�� ListView���������������ǻ��ܷ����Ľ����������䣻
  • 3�����������Ľṹ��Ҫ�����������dz������й����У������������˺��ѣ���ô������Ҫ��������Ϣˢ�µ��������У���������������ʱ����Ϊ�˸��ӱ��ݸ�Ч����������������Ƕ�׵� ListView�������������ر����⣬���ԴӺ����Ĵ����л��ô𰸣���

6.4�¼�����


�������� UI �����У�Ϊ����ʹ UI ��ҵ���߼����룬��Ҫ�����ǰ� UI �������ṩ������������չʾЧ���Ľӿ��Լ����������¼������ࡣ

��ô���԰�����ͼ���⣺
����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_8.png

������Щ�ӿھ�������Ŀǰ UI Ϊ�ⲿ�ṩ��������Ϊ�ӿڣ���Щ�ӿڵ�һ����·�������ǣ��򿪴��ڡ��������ѡ����Ӻ��ѡ��򿪶Ի��򡢷�����Ϣ��

7��ͨ������


7.1ϵͳ�ܹ�


����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_9.jpg

��ǰ����˵�����ʺϵļܹ������Ƿ����㵱����Ҫ���õļܹ���

��ô��ô������Ҫ�ļܹ��أ�

֮�����������ƣ�������ϵͳ�������¼���ǰ�᣺

  • 1��ϵͳ�ڷ�����Ҫ�� web ҳ�����й���ͨ���û��Լ������˵Ŀ��ƺͼ��أ�
  • 2�����ݿ��Ķ����࣬��Ҫ���ⲿ��Ⱦ��Ҫ�и����ԣ����磺�������ݿ��౩©���ⲿ��չʾ��ʹ���ˣ���ô������Ҫ����һ���ֶΣ��������ֶ��ֲ��������ݿ����ڵ����ԡ���ô����ʱ�����Ѿ������ݿ�����Ⱦ�ˣ���
  • 3����ΪĿǰ������ Java ������ʵ�� Netty ͨ�ţ���ô���������ͻ��˶�����Ҫʹ�õ�ͨ�Ź����е�Э�鶨���ͽ�������ô������Ҫ������һ�������ṩ Jar �����������ã���Ȼ�ͻ��˺ͷ����˸���ͬ���Ĵ���ά������̫�����ˣ���
  • 4���ӿڡ�ҵ���������ײ�������ͨ�Ž�����Ҫ����ȷ�����ֺ�ʵ�֣��������ɻ�������ά����

���������������ĵ���ǰ�ᣬ��ͷ������ʲôģ�ͽṹ�����ˣ��Լ���Ӧ�ļ���ջѡ�����Ƿ��мƻ��ˣ�

�������һ��������ּܹ����Ƶ�ģ�ͣ�һ�������dz���Ϥ�� MVC������һ������������˵���� DDD �����������ơ�

7.2ͨ��Э��


����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_10.png

��ͼ���������������ڴ���������ʱ����Ҫ�ڴ�����������һ����֡��ʶ���Դ����жϵ�ǰ��ҵ���������ĸ�������Ҳ�Ϳ��������ǵ�ҵ����������������ʹ�ô����� if �����жϡ�

Э�����ܣ�
agreement
������ src
    ������ main
    ��   ������ java
    ��   ��   ������ org.itstack.naive.chat
    ��   ��       ������ codec
    ��   ��       ��    ������ ObjDecoder.java
    ��   ��       ��    ������ ObjEncoder.java
    ��   ��       ������ protocol
    ��   ��       ��    ������ demo
    ��   ��       ��    ������ Command.java
    ��   ��       ��    ������ Packet.java
    ��   ��       ������ util
    ��   ��             ������ SerializationUtil.java
    ��   ������ resources    
    ��   ��   ������ application.yml
    ��   ������ webapp
    ��       ������ chat
    ��       ������ res
    ��       ������ index.html
    ������ test
         ������ java
             ������ org.itstack.demo.test
                 ������ ApiTest.java

������
public abstract class Packet {

    private final static Map<Byte, Class<? extends Packet>> packetType = new ConcurrentHashMap<>();

    static {
        packetType.put(Command.LoginRequest, LoginRequest.class);
        packetType.put(Command.LoginResponse, LoginResponse.class);
        packetType.put(Command.MsgRequest, MsgRequest.class);
        packetType.put(Command.MsgResponse, MsgResponse.class);
        packetType.put(Command.TalkNoticeRequest, TalkNoticeRequest.class);
        packetType.put(Command.TalkNoticeResponse, TalkNoticeResponse.class);
        packetType.put(Command.SearchFriendRequest, SearchFriendRequest.class);
        packetType.put(Command.SearchFriendResponse, SearchFriendResponse.class);
        packetType.put(Command.AddFriendRequest, AddFriendRequest.class);
        packetType.put(Command.AddFriendResponse, AddFriendResponse.class);
        packetType.put(Command.DelTalkRequest, DelTalkRequest.class);
        packetType.put(Command.MsgGroupRequest, MsgGroupRequest.class);
        packetType.put(Command.MsgGroupResponse, MsgGroupResponse.class);
        packetType.put(Command.ReconnectRequest, ReconnectRequest.class);
    }

    public static Class<? extends Packet> get(Byte command) {
        return packetType.get(command);
    }

    /**
     * ��ȡЭ��ָ��
     *
     * @return ����ָ��ֵ
     */
    public abstract Byte getCommand();
}

7.3���Ӻ���


����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_11.jpg

������������ͼ�п��Կ������������������������ݣ��������Ѻ����Ӻ��ѡ�

���������ɺ��Ѻ󣬺��ѻ����ֵ����ǵĺ������С�

�������������Dz��õ��ǵ�����ͬ���Ӻ��ѣ�Ҳ����������һ�����ѵ�ʱ�򣬶Է�Ҳͬ�������ĺ�����Ϣ��

��������ҵ��������Ҫ���Ӻ��Ѳ�ͬ���ģ���ô�����ڷ����������ӵ�ʱ��������һ��״̬��Ϣ�������Ӻ��ѡ��Է�ͬ�����������û����ܳ�Ϊ���Ѳ�����ͨ�š�

���Ӻ��ѵ��������룺
public class AddFriendHandler extends MyBizHandler<AddFriendRequest> {

    public AddFriendHandler(UserService userService) {
        super(userService);
    }

    @Override
    public void channelRead(Channel channel, AddFriendRequest msg) {
        // 1. ���Ӻ��ѵ����ݿ���[A->B B->A]
        List<UserFriend> userFriendList = new ArrayList<>();
        userFriendList.add(new UserFriend(msg.getUserId(), msg.getFriendId()));
        userFriendList.add(new UserFriend(msg.getFriendId(), msg.getUserId()));
        userService.addUserFriend(userFriendList);
        // 2. ���ͺ����������� A
        UserInfo userInfo = userService.queryUserInfo(msg.getFriendId());
        channel.writeAndFlush(new AddFriendResponse(userInfo.getUserId(), userInfo.getUserNickName(), userInfo.getUserHead()));
        // 3. ���ͺ����������� B
        Channel friendChannel = SocketChannelUtil.getChannel(msg.getFriendId());
        if (null == friendChannel) return;
        UserInfo friendInfo = userService.queryUserInfo(msg.getUserId());
        friendChannel.writeAndFlush(new AddFriendResponse(friendInfo.getUserId(), friendInfo.getUserNickName(), friendInfo.getUserHead()));
    }
}

7.4��ϢӦ��


����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_12.jpg

�����������̿��Կ��������û��������ѡ�Ⱥ��ͨ�ŵ�ʱ�򣬻ᴥ��һ���¼���Ϊ���������ͻ����������˷��������ѵĶԻ�������

�������յ��Ի��������������Ǻ��ѶԻ�����ô��Ҫ���������ѵ�ͨ����Ϣ���Ի����С�ͬʱ֪ͨ���ѣ�������Ҫͨ���ˡ������Լ��ĶԻ����б��У����Ҽӽ�ȥ��

������Ⱥ��ͨ�ţ��ǿ��Բ�������֪ͨ�ģ���Ϊ�����ܰѻ�û�����ߵ�����Ⱥ���û�ȫ��֪ͨ���˼һ�û��¼�����������ⲿ��ֻ��Ҫ���û������յ���Ϣ�󣬴������Ի������б��м��ɡ�������ϸ�����£�ͬʱҲ������������ʵ�ֵķ�ʽ��

��ϢӦ���������룺
public class MsgHandler extends MyBizHandler<MsgRequest> {

    public MsgHandler(UserService userService) {
        super(userService);
    }

    @Override
    public void channelRead(Channel channel, MsgRequest msg) {
        logger.info("��Ϣ��Ϣ������{}", JSON.toJSONString(msg));
        // �첽д��
        userService.asyncAppendChatRecord(new ChatRecordInfo(msg.getUserId(), msg.getFriendId(), msg.getMsgText(), msg.getMsgType(), msg.getMsgDate()));
        // ���ӶԻ���[�����Է�û�����ĶԻ���������]
        userService.addTalkBoxInfo(msg.getFriendId(), msg.getUserId(), Constants.TalkType.Friend.getCode());
        // ��ȡ����ͨ�Źܵ�
        Channel friendChannel = SocketChannelUtil.getChannel(msg.getFriendId());
        if (null == friendChannel) {
            logger.info("�û�id��{}δ��¼��", msg.getFriendId());
            return;
        }
        // ������Ϣ
        friendChannel.writeAndFlush(new MsgResponse(msg.getUserId(), msg.getMsgText(), msg.getMsgType(), msg.getMsgDate()));
    }
}

7.5��������


����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_13.jpg

���������������ǿ��������������ӶϿ��Ժ󣬻��������˷����������ӵ������� ��ô�������������ӵĹ��̣���ϵͳ���ʼ�����������𡣶�����������Ҫ���û��� ID ��Ϣһͬ���͸������ˣ����÷����˿���ȥ�����û���ͨ�Źܵ� Channel �İ󶨹�ϵ��

ͬʱ����Ҫ����Ⱥ���ڵ�������Ϣ�����û�����������Ⱥ��ӳ���С���ʱ�Ϳ��Իָ��û������Ѻ�Ⱥ����ͨ�Ź��ܡ�

��ϢӦ���������룺
// Channel ״̬��ʱѲ�죻3 ����ÿ 5 ��ִ��һ��
scheduledExecutorService.scheduleAtFixedRate(() -> {while (!nettyClient.isActive()) {System.out.println("ͨ�Źܵ�Ѳ�죺ͨ�Źܵ�״̬" + nettyClient.isActive());
        try {System.out.println("ͨ�Źܵ�Ѳ�죺�������� [Begin]");
            Channel freshChannel = executorService.submit(nettyClient).get();
            if (null == CacheUtil.userId) continue;
            freshChannel.writeAndFlush(new ReconnectRequest(CacheUtil.userId));
        } catch (InterruptedException | ExecutionException e) {System.out.println("ͨ�Źܵ�Ѳ�죺�������� [Error]");}
    }
}, 3, 5, TimeUnit.SECONDS);

��������ѧϰ��


7.6��Ⱥͨ��


����Դ��ѧIM(��)������Nettyʵ��һ�׷ֲ�ʽIMϵͳ_14.png

����ͼ��ʾ����������ʵ��IM��Ⱥͨ�ŵģ�

  • 1��������֮�䰸������redis�ķ����Ͷ��Ľ��д�����Ϣ���������Ǵ��ͷ�������ʹ��zookeeper��
  • 2���û�A�ڷ�����Ϣ���û�Bʱ������Ҫ����B��channeId�������ڷ����˽��в���channeId�����Ƿ��Լ��ķ����ڣ�
  • 3����̨����Ҳ������������Netty���񣬳����ڻ��Զ�Ѱ�ҿ��ö˿ڡ�

8��������


��IMϵͳ�漰���ļ���ջ���ݽ϶ࣺNetty4.x��SpringBoot��Mybatis��Mysql��JavaFx��layui�ȼ���ջ��ʹ�ã��Լ�����ϵͳ���ܽṹ����DDD�IJ��ܹ�+Socketģ���ķ�ʽ���д�����е�UI����ǰ���˷����¼�������ʽ�������ơ�������������ֻҪ���ܼ���ѧϰ��������ôһ�����ջ��dz��������ݡ��㹻��ţ����

�κ�һ���¼���ջ��ѧϰ���̶�����������һ��·�ߣ�����HelloWorld������ʹ��API����Ŀʵ���Լ�����������Դ���ھ��� ��ô����������һ������ʱ����Java����Ա�϶����뵽һЩ�еļ���֪ʶ��������������Ŀ�еĸ���ģ�飨���磺������JavaFx��Swing�ȣ�ͨ����Socket����֪��Netty���ܡ������˿�����MVCģ�ͼ���SpringBoot������������ô����Щ��������ջ�����ļ��������ǵ�ϵͳȷ��ѧϰ��ʵ�����ɳ�����������Ҫ�IJ��֡�

���ˣ�IM����ʵ�����漰��֪ʶά�ȷdz��࣬����ƪ���Ͳ�������¸��࣬��λ�������ض���Դ��ͬ������ѧϰ������Ч�������ã�Դ���ڱ��ġ�4������Դ����һ�ڵĸ���������������

9�������


[1] �������ţ�ĿǰΪֹ��͸���ĵ�Netty������ԭ���Ϳ��ܼܹ�����
[2] д����ѧ�ߣ�Java������NIO����Netty��ѧϰ�����ͽ��ײ���
[3] ʷ����ǿJava NIO���ţ����Ĵ����ŵ������ģ�������ƪ��
[4] Java��BIO��NIO���Ѷ����ô���ʵ�����㿴���ٲ�����ת�У�
[5] ʷ����ͨ��Netty�������ų��ģ��������ܡ������������ʵս
[6] ������ϵʵ�ʣ�һ�׵��͵�IMͨ��Э����������
[7] dz̸IMϵͳ�ļܹ�����
[8] �����ƶ���IM��������Щ�ӣ��ܹ����ơ�ͨ��Э���Ϳͻ���
[9] һ�׺��������û����ƶ���IM�ܹ�����ʵ������(����ϸͼ��)
[10] һ��ԭ���ֲ�ʽ��ʱͨѶ(IM)ϵͳ���ۼܹ�����
[11]  һ�׸߿��á����������߲�����IMȺ�ġ����ļܹ���������ʵ��
[12] һ���ڼ��û���IM�ܹ������ɻ�(��ƪ)�������ܹ����������ֵ�
[13] һ���ڼ��û���IM�ܹ������ɻ�(��ƪ)���ɿ��ԡ������ԡ������Ż���
[14] �����ֵ�ר�ң���������һ���ڼ���Ϣ���ķֲ�ʽIMϵͳ
[15] ����ʵ����һ�װ�����Ϣ��С��ģIMϵͳ����Ҫ���ܽ�

��ʱͨѶ�� - ��ʱͨѶ������������ ��Դ�� - ��ʱͨѶ������������

��һƪ������IM�˵���̨���ٴδ���ʱ����ʱ����Ҫһ��ʱ����һƪ��[�ѻظ�] ����iOS����MobileIMSDK������Ϣʱ���ӻ��Ͽ�������

��������¼�����¼���ר��

�Ƽ�����
���� 2
���˻���nettyʵ�ֵ�im֮�⣬DDD��ģʽ�ṹҲ��ֵ��ѧϰ��һ��
�ܽ��ˣ�д�ķdz���ϸ��
����¥�� ×
ʹ��΢�Ŵ��ͣ� ʹ��֧�������ͣ�

���ض���