精华内容
下载资源
问答
  • 以下是在WhatsApp中发起群聊的方法。 Open WhatsApp on your smartphone. On iOS, tap New Group. On Android, tap the Menu icon and then New group. 在智能手机上打开WhatsApp。 在iOS上,点击“新建组”。 在...
    _preview

    WhatsApp is a great way to stay in contact with people, regardless of what smartphone they use. And, like SMS, WhatsApp supports Group Chats so you can talk with a group of friends, your sports team, clubs, or any other group of people. Here’s how to start a group chat in WhatsApp.

    无论人们使用什么智能手机,WhatsApp都是与他们保持联系的好方法。 而且,像SMS一样,WhatsApp支持群聊,因此您可以与一群朋友,您的运动队,俱乐部或其他任何人聊天。 以下是在WhatsApp中发起群聊的方法。

    Open WhatsApp on your smartphone. On iOS, tap New Group. On Android, tap the Menu icon and then New group.

    在智能手机上打开WhatsApp。 在iOS上,点击“新建组”。 在Android设备上,点击“菜单”图标,然后点击“新建”组。

    1iosnewgroup
    2settingsandroid

    Scroll down through your contacts and tap on anyone you want to add to the group. When you’re done, tap Next.

    向下滚动您的联系人,然后点击要添加到该组的任何人。 完成后,点击下一步。

    3adding1
    4adding2

    Add a Subject for your Group Chat and, if you want, a thumbnail.

    为您的群聊添加主题,如果需要,还可以添加缩略图。

    5settingup
    6settingup2

    Tap Create and your Group Chat is ready to go. Any message sent to it, gets shared with everyone.

    点击创建,您的群聊准备就绪。 发送给它的任何消息都会与所有人共享。

    7group

    In a Group Chat, even if you have Read Receipts turned off, you’re still able to see who’s received and read your messages. Just swipe to the left on any message.

    在群聊中,即使您已关闭“已读回执” ,您仍然可以查看收到了谁并阅读了您的消息。 只需在任何消息上向左滑动即可。

    7read

    To manage your Group Chat, click on its name. Here, you can add new participants, delete the group, and change the Subject and Thumbnail.

    要管理您的群聊,请单击其名称。 在这里,您可以添加新参与者,删除组以及更改主题和缩略图。

    8settings1
    9settings2

    If you want to make someone else an Admin—they’ll be able to add new members and kick out old ones—or remove someone from your Group Chat, tap on their name and then the relevant option.

    如果您想让其他人成为管理员(他们将能够添加新成员并踢掉旧成员)或从群聊中删除某人,请点击他们的姓名,然后点击相关选项。

    10makeadmin

    Now you’ll be able to keep up with all your friends easily—no matter where they live or what kind of phone they have.

    现在,您可以轻松地与所有朋友保持联系,无论他们住在哪里或使用哪种手机。

    翻译自: https://www.howtogeek.com/282196/how-to-start-a-group-chat-in-whatsapp/

    展开全文
  • <div><p>「发起群聊」界面点确定后如何跳转到会话界面,并且返回按钮能正常返回到主界面?主要是navigationController的栈怎么处理? 类似微信,在第二个标签页「通讯录」里新建群聊,...
  • 现在layIm 整到vue项目里面了,但是vue路由跳转会把layim带出来,覆盖在新的页面上,,另外发起群聊,添加好友的页面及历史聊天信息的页面如何便捷的绘制,如图,只看到文档这么在新的temple页面插入标签,另外文档...
  • 群聊发起与通知 这小节,我们来学习一下如何创建一个群聊,并通知到群聊中的各位成员 我们依然是先来看一下最终的效果是什么样的。 1. 最终效果 服务端       创建群聊的客户端       ...

    群聊的发起与通知

    这小节,我们来学习一下如何创建一个群聊,并通知到群聊中的各位成员

    我们依然是先来看一下最终的效果是什么样的。

    1. 最终效果

    服务端

     

    image.png

     

     

    创建群聊的客户端

     

    image.png

     

     

    其他客户端

     

    image.png

     

    image.png

     

     

    1. 首先,依然是三位用户依次登录到服务器,分别是闪电侠、极速、萨维塔。
    2. 然后,我们在闪电侠的控制台输入 createGroup 指令,提示创建群聊需要输入 userId 列表,然后我们输入以英文逗号分隔的 userId。
    3. 群聊创建成功之后,分别在服务端和三个客户端弹出提示消息,包括群的 ID 以及群里各位用户的昵称。

    2. 群聊原理

    群聊的原理我们在 仿微信 IM 系统简介 已经学习过,我们再来重温一下

    群聊指的是一个组内多个用户之间的聊天,一个用户发到群组的消息会被组内任何一个成员接收,下面我们来看一下群聊的基本流程。

     

    image.png

     

     

    如上图,要实现群聊,其实和单聊类似

    1. A,B,C 依然会经历登录流程,服务端保存用户标识对应的 TCP 连接
    2. A 发起群聊的时候,将 A,B,C 的标识发送至服务端,服务端拿到之后建立一个群聊 ID,然后把这个 ID 与 A,B,C 的标识绑定
    3. 群聊里面任意一方在群里聊天的时候,将群聊 ID 发送至服务端,服务端拿到群聊 ID 之后,取出对应的用户标识,遍历用户标识对应的 TCP 连接,就可以将消息发送至每一个群聊成员

    这一小节,我们把重点放在创建一个群聊上,由于控制台输入的指令越来越多,因此在正式开始之前,我们先对我们的控制台程序稍作重构。

    2. 控制台程序重构

    2.1 创建控制台命令执行器

    首先,我们把在控制台要执行的操作抽象出来,抽象出一个接口

    ConsoleCommand.java

    public interface ConsoleCommand {
        void exec(Scanner scanner, Channel channel);
    }
    

    2.2 管理控制台命令执行器

    接着,我们创建一个管理类来对这些操作进行管理。

    ConsoleCommandManager.java

    public class ConsoleCommandManager implements ConsoleCommand {
        private Map<String, ConsoleCommand> consoleCommandMap;
    
        public ConsoleCommandManager() {
            consoleCommandMap = new HashMap<>();
            consoleCommandMap.put("sendToUser", new SendToUserConsoleCommand());
            consoleCommandMap.put("logout", new LogoutConsoleCommand());
            consoleCommandMap.put("createGroup", new CreateGroupConsoleCommand());
        }
    
        @Override
        public void exec(Scanner scanner, Channel channel) {
            //  获取第一个指令
            String command = scanner.next();
    
            ConsoleCommand consoleCommand = consoleCommandMap.get(command);
    
            if (consoleCommand != null) {
                consoleCommand.exec(scanner, channel);
            } else {
                System.err.println("无法识别[" + command + "]指令,请重新输入!");
            }
        }
    }
    
    1. 我们在这个管理类中,把所有要管理的控制台指令都塞到一个 map 中。
    2. 执行具体操作的时候,我们先获取控制台第一个输入的指令,这里以字符串代替,比较清晰(这里我们已经实现了上小节课后思考题中的登出操作),然后通过这个指令拿到对应的控制台命令执行器执行。

    这里我们就拿创建群聊举个栗子:首先,我们在控制台输入 createGroup,然后我们按下回车,就会进入 CreateGroupConsoleCommand 这个类进行处理

    CreateGroupConsoleCommand.java

    public class CreateGroupConsoleCommand implements ConsoleCommand {
    
        private static final String USER_ID_SPLITER = ",";
    
        @Override
        public void exec(Scanner scanner, Channel channel) {
            CreateGroupRequestPacket createGroupRequestPacket = new CreateGroupRequestPacket();
    
            System.out.print("【拉人群聊】输入 userId 列表,userId 之间英文逗号隔开:");
            String userIds = scanner.next();
            createGroupRequestPacket.setUserIdList(Arrays.asList(userIds.split(USER_ID_SPLITER)));
            channel.writeAndFlush(createGroupRequestPacket);
        }
    
    }
    

    进入到 CreateGroupConsoleCommand 的逻辑之后,我们创建了一个群聊创建请求的数据包,然后提示输入以英文逗号分隔的 userId 的列表,填充完这个数据包之后,调用 writeAndFlush() 我们就可以发送一个创建群聊的指令到服务端。

    最后,我们再来看一下经过我们的改造,客户端的控制台线程相关的代码。

    NettyClient.java

    private static void startConsoleThread(Channel channel) {
        ConsoleCommandManager consoleCommandManager = new ConsoleCommandManager();
        LoginConsoleCommand loginConsoleCommand = new LoginConsoleCommand();
        Scanner scanner = new Scanner(System.in);
    
        new Thread(() -> {
            while (!Thread.interrupted()) {
                if (!SessionUtil.hasLogin(channel)) {
                    loginConsoleCommand.exec(scanner, channel);
                } else {
                    consoleCommandManager.exec(scanner, channel);
                }
            }
        }).start();
    }
    

    抽取出控制台指令执行器之后,客户端控制台逻辑已经相对之前清晰很多了,可以非常方便地在控制台模拟各种在 IM 聊天窗口的操作,接下来,我们就来看一下如何创建群聊。

    3. 创建群聊的实现

    3.1 客户端发送创建群聊请求

    通过我们前面讲述控制台逻辑的重构,我们已经了解到我们是发送一个 CreateGroupRequestPacket 数据包到服务端,这个数据包的格式为:

    CreateGroupRequestPacket.java

    public class CreateGroupRequestPacket extends Packet {
        private List<String> userIdList;
    }
    

    它只包含了一个列表,这个列表就是需要拉取群聊的用户列表,接下来我们看下服务端如何处理的。

    3.2 服务端处理创建群聊请求

    我们依然是创建一个 handler 来处理新的指令。

    NettyServer.java

    .childHandler(new ChannelInitializer<NioSocketChannel>() {
        protected void initChannel(NioSocketChannel ch) {
            // ...
            // 添加一个 handler 
            ch.pipeline().addLast(new CreateGroupRequestHandler());
            // ...
        }
    });
    

    接下来,我们来看一下这个 handler 具体做哪些事情

    CreateGroupRequestHandler.java

    public class CreateGroupRequestHandler extends SimpleChannelInboundHandler<CreateGroupRequestPacket> {
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, CreateGroupRequestPacket createGroupRequestPacket) {
            List<String> userIdList = createGroupRequestPacket.getUserIdList();
    
            List<String> userNameList = new ArrayList<>();
            // 1. 创建一个 channel 分组
            ChannelGroup channelGroup = new DefaultChannelGroup(ctx.executor());
    
            // 2. 筛选出待加入群聊的用户的 channel 和 userName
            for (String userId : userIdList) {
                Channel channel = SessionUtil.getChannel(userId);
                if (channel != null) {
                    channelGroup.add(channel);
                    userNameList.add(SessionUtil.getSession(channel).getUserName());
                }
            }
    
            // 3. 创建群聊创建结果的响应
            CreateGroupResponsePacket createGroupResponsePacket = new CreateGroupResponsePacket();
            createGroupResponsePacket.setSuccess(true);
            createGroupResponsePacket.setGroupId(IDUtil.randomId());
            createGroupResponsePacket.setUserNameList(userNameList);
    
            // 4. 给每个客户端发送拉群通知
            channelGroup.writeAndFlush(createGroupResponsePacket);
    
            System.out.print("群创建成功,id 为[" + createGroupResponsePacket.getGroupId() + "], ");
            System.out.println("群里面有:" + createGroupResponsePacket.getUserNameList());
    
        }
    }
    

    整个过程可以分为以下几个过程

    1. 首先,我们这里创建一个 ChannelGroup。这里简单介绍一下 ChannelGroup:它可以把多个 chanel 的操作聚合在一起,可以往它里面添加删除 channel,可以进行 channel 的批量读写,关闭等操作,详细的功能读者可以自行翻看这个接口的方法。这里我们一个群组其实就是一个 channel 的分组集合,使用 ChannelGroup 非常方便。
    2. 接下来,我们遍历待加入群聊的 userId,如果存在该用户,就把对应的 channel 添加到ChannelGroup 中,用户昵称也添加到昵称列表中。
    3. 然后,我们创建一个创建群聊响应的对象,其中 groupId 是随机生成的,群聊创建结果一共三个字段,这里就不展开对这个类进行说明了。
    4. 最后,我们调用 ChannelGroup 的聚合发送功能,将拉群的通知批量地发送到客户端,接着在服务端控制台打印创建群聊成功的信息,至此,服务端处理创建群聊请求的逻辑结束。

    我们接下来再来看一下客户端处理创建群聊响应。

    3.3 客户端处理创建群聊响应

    客户端依然也是创建一个 handler 来处理新的指令。

    NettyClient.java

    .handler(new ChannelInitializer<SocketChannel>() {
        @Override
        public void initChannel(SocketChannel ch) {
            // ...
            // 添加一个新的 handler 来处理创建群聊成功响应的指令
            ch.pipeline().addLast(new CreateGroupResponseHandler());
            // ...
        }
    });
    

    然后,在我们的应用程序里面,我们仅仅是把创建群聊成功之后的具体信息打印出来。

    CreateGroupResponseHandler.java

    public class CreateGroupResponseHandler extends SimpleChannelInboundHandler<CreateGroupResponsePacket> {
    
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, CreateGroupResponsePacket createGroupResponsePacket) {
            System.out.print("群创建成功,id 为[" + createGroupResponsePacket.getGroupId() + "], ");
            System.out.println("群里面有:" + createGroupResponsePacket.getUserNameList());
        }
    }
    

    在实际生产环境中,CreateGroupResponsePacket 对象里面可能有更多的信息,然后以上逻辑的处理也会更加复杂,不过我们这里已经能说明问题了。

    到了这里,这小节的内容到这里就告一段落了,下小节,我们来学习群聊成员管理,包括添加删除成员,获取成员列表等等,最后,我们再对本小节内容做一下总结。

    4. 总结

    1. 群聊的原理和单聊类似,无非都是通过标识拿到 channel。
    2. 本小节,我们重构了一下控制台的程序结构,在实际带有 UI 的 IM 应用中,我们输入的第一个指令其实就是对应我们点击 UI 的某些按钮或菜单的操作。
    3. 通过 ChannelGroup,我们可以很方便地对一组 channel 进行批量操作。
    展开全文
  •  之前我们简单介绍一下钉钉内置的“群直播”功能的使用方法,但是除了“群直播”外,用户还可以通过任意群聊内的“发起直播”功能快速进入创建直播!那么,该怎么操作呢?感兴趣的朋友,不妨和小编一起来了解一下。...

    本篇文章由 泉州SEO www.234yp.com 整理发布,word办公软件 www.234yp.com/Article/155237.html 谢谢合作!
    word办公软件

      之前我们简单介绍一下钉钉内置的“群直播”功能的使用方法,但是除了“群直播”外,用户还可以通过任意群聊内的“发起直播”功能快速进入创建直播!那么,该怎么操作呢?感兴趣的朋友,不妨和小编一起来了解一下。

      方法步骤

      打开钉钉,进入任意群聊后,点击“发起直播”图标;

    钉钉如何发起直播?

      输入直播主题,选择直播模式,并调整一些设置后,再按下“创建直播”按钮即可。

    钉钉如何发起直播?

    展开全文
  • 前些天做了一个网站:https://modubox.cn 其中有个群聊插件,许多人问如何实现的。这里简单说下,为了快速完成群聊功能,我选择从最简单的 WebSocket 开始。 什么是WebSocket ? 既然要使用它,就需要了解一下它吧。...

    如何快速实现一个聊天室?

    聊天室

    前些天做了一个网站:https://modubox.cn 其中有个群聊插件,许多人问如何实现的。这里简单说下,为了快速完成群聊功能,我选择从最简单的 WebSocket 开始。

    什么是WebSocket ?

    既然要使用它,就需要了解一下它吧。WebSocket其实也是一种基于TCP的网络协议,它与HTTP协议最大的不同是:是一种双向通信协议,在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,而HTTP协议只能客户端主动发起通信。

    所以WebSocket能够用于聊天,当然其他地方也能应用,如果做客服系统或推送消息都可以从这里开始。

    如何实现单聊/群聊?

    群聊:所有客户端的消息发送到服务器,服务端将消息发送给所有客户端。

    单聊:WebSocket客户端之间是无法直接通信的,想要通信,必须由服务端转发。

    群聊单聊

    实现

    1. 引入WebSocket的支持

    我们使用当前最流行的Spring Boot框架构建项目,然后引入Spring Boot 对 WebSocket 的支持:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    

    2. 开启WebSocket

    @Configuration
    public class WebSocketConfig {
    
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }
    

    3. 服务端

    这里主要有以下几点:

    1. 声明服务端点路径
    2. 存储所有连接用户,等待匹配用户
    3. 连接 onOpen,消息OnMessage,关闭onClose,错误onError 方法
    4. 发送消息给特定连接者
    @ServerEndpoint(value = "/websocket/random/")
    @Component
    public class ChatRandomServer {
        //所有连接
        public static ConcurrentHashMap<String, ChatRandomServer> webSocketSet = new ConcurrentHashMap<>();
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
        //所有在配对的ID
        private static List<String> webSocketLiveList = new CopyOnWriteArrayList();
        //自己的id标识
        private String id = "";
        //连接对象的id标识
        private String toUser = "";
    
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(Session session) {
            session.setMaxIdleTimeout(3600000);
            this.session = session;
            //获取用户ip
            String ip = IpUtil.getRemoteAddress(session);
            this.id = ip;
            ChatRandomServer put = webSocketSet.put(this.id, this);
            //如果已经在队里,就不去找对象
            if (put == null) {
                try {
                    if (pair()) {
                        sendMessage("匹配成功");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    sendMessage("匹配失败");
                    webSocketSet.remove(this.id); 
                    session.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
            }
            log.info("用户{}加入!当前在线人数为: {}", this.id, webSocketSet.size());
    
        }
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            ChatRandomServer UserId = webSocketSet.get(toUser);
            webSocketLiveList.remove(this.id);
            if (UserId != null) {
                try {
                    sendToUser(session, "对方已离开", toUser);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            webSocketSet.remove(this.id);
            log.info("{}连接关闭!当前在线人数:{}, 当前在匹配的人数:{}" ,this.id,webSocketSet.size(), webSocketLiveList.size());
        }
    
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            log.info("来自 {} 的消息: {}", this.id, message);
            try {
                ChatRandomServer.sendToUser(session, message, toUser, 2);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        @OnError
        public void onError(Session session, Throwable error) {
            log.error("发生错误");
            error.printStackTrace();
            try {
                SendSelf(session,"服务器出现错误");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 发送消息给自己
         */
        public void sendMessage(String message) throws IOException {
            SendSelf(this.session, message);
        }
        private static void SendSelf(Session session, String message) throws IOException {
            session.getBasicRemote().sendText(message);
        }
    
        /**
         * 发送信息给指定ID用户
         */
        public static void sendToUser(Session session, String message, String sendUserId) throws IOException {
            ChatRandomServer UserId = webSocketSet.get(sendUserId);
            if (UserId != null) {
                UserId.sendMessage(message);
            } else {
                SendSelf(session, "发送失败");
            }
        }
    
        /**
         * 通知除了自己之外的所有人
         */
        private void sendOnlineCount(String message) {
            for (String key : webSocketSet.keySet()) {
                try {
                    if (key.equals(id)) {
                        continue;
                    }
                    webSocketSet.get(key).sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 发送信息给所有人
         */
        public void sendToAll(String message) throws IOException {
            for (String key : webSocketSet.keySet()) {
                try {
                    webSocketSet.get(key).sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public synchronized boolean pair() throws IOException {
            //是否存在等待匹配的用户
            if (webSocketLiveList.size() > 0) {
                //随机匹配一个
                Random ra = new Random();
                int nextInt = ra.nextInt(webSocketLiveList.size());
                toUser = webSocketLiveList.get(nextInt);
    
                try {
                    ChatRandomServer UserId = webSocketSet.get(toUser);
                    UserId.setToUser(id);
                    sendToUser(session, "配对成功", toUser);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                webSocketLiveList.remove(nextInt);
                return true;
            }
            //没有匹配的,则将自己加入等待匹配队列
            webSocketLiveList.add(id);
            return false;
        }
    }
    

    4. 前端支持

     start: function () {
            if (typeof (WebSocket) === "undefined") {
              alert("您的浏览器不支持socket")
            } else {
              // 实例化socket
              this.socket = new WebSocket(`ws://localhost:8082/websocket/room`);
              // 监听socket连接
              this.socket.onopen = this.open
              // 监听socket错误信息
              this.socket.onerror = this.error
              // 监听socket消息
              this.socket.onmessage = this.getMessage
              this.socket.onclose = this.close
            }
          },
          open: function () {
          },
          error: function () {
          },
          getMessage: function (obj) {
            //接收信息后根据不同情况不同处理方式
            let data = JSON.parse(obj.data);
            if (data.code === 1) {
            } else if (data.code === 2) {
            } else {
            }
          },
          close: function (e) {
          },
    
          doSend: function () {
            if (that.sendData === '') {
              return;
            }
            this.socket.send(that.sendData);
            that.sendData = '';
          },
    

    以上代码不完整,如果需要看下完整代码,联系我。

    展开全文
  • 问题描述: 默认情况下,A群内的任意成员都可以邀请A群内的所有成员到另一个B群。如图所示: 解决方案 那么群主如何设置不允许群内成员邀请其他成员进另一个群呢...关闭"允许普通成员发起新的群聊"即可 测试 ...
  • IM中群聊消息投递:保证所有接收方展现顺序一致; 电商充值支付消息:保证同一个用户发起的请求在服务端执行序列一致。 实时消息时序和一致性是分布式系统架构设计中非常难的问题(尤其IM应用这种以消息为中心的...
  • 左上角+-发起群聊 选择分类建群 选择一个类别,例如“项目群” 写入群名称,例如“树莓派测试群”,归属企业随便选,我也不知道这个列表钉钉是如何定义的,可能和已加入的群聊的归属企业有关。然后点击下方的立即...
  • 首先,打开微信主页,点击右上角的“+”号,选择“发起群聊”,进入后会出现你微信好友的列表,选择你想要检测的好友。选好后,如果是正常好友的话,它会提示已经加入了群聊,但是如果对方已...
  • 作者:隋晓旭 想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。 你是否想过从头开发一款类似 QQ、微信...发起群聊 支持文字消息、语音消息、图片消息 支持
  • 参见《机器人 | 如何群聊中使用机器人?》 Python调用Custom Bot 官网的原话是: 获取到 Webhook 地址后,用户可以使用任何方式向该 Webhook 发起 HTTP POST 请求,即可实现给该群组发送消息。自定义机器人消息体 ...
  • 很多人都以为,如果被微信好友拉黑或者删除了之后,就无法联系到对方了。其实不是这样的,接下来就教你进行简单的操作。...1、首先,点击微信右上角【+号】,点开之后选择【发起群聊】 2、创建一个3人群...
  • 企业微信支持直接在群聊发起「群直播」。 老师可以在企业微信班级群发起群直播,家长和学生在微信直接收看,不用安装与学习其他额外的APP,在线课堂顺畅可互动,为老师和学生提供安心的教学环境。企业也可用来...
  • 最近和几位朋友群聊,大家都很好奇目前国内究竟有多少人从事于前端开发这个行业,它们的技能如何,待遇如何,对目前的现状感受如何。于是决定发起这个调查问卷,长期有效。 建议看到此信息的前端er们参与并推广此...
  • 前几天微信群聊的同学弄了一个什么群接龙(微信小程序),大概的目的就是统计一下同学大家目前都是哪个省份、那个城市、从事什么类型的工作,现在的住址、联系方式是什么。大家都很积极的填写完成后,只能由群接龙发起...
  • [思考] 在页面中引入静态资源文件,为什么静态资源文件改变后,再次发起请求还是之前的内容,没有变化呢?,参考:# [思考] 在使用webpack等一些打包工具时,为什么要加上一串hash码?,参考:# HTTP长链接 ...
  • Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

如何发起群聊