-
2021-12-09 10:19:15
群聊天室
需求如下
-
在聊天界面中建立
websocket
连接. -
一个客户端发消息, 服务端接收消息后把消息分发给所有客户端.
-
客户端接收服务端发回来的消息, 打印.(显示在聊天记录区域)
-
提示当前在线人数.
-
服务端中一旦接收到客户端连接, 维护一个全局变量
count
, 记录当前在线人数(count++
)// 声明一个全局变量count, 用于保存当前在线人数 let count = 0 socketio.on('connection', (socket)=>{ console.log('有客户端连进来了:'+socket.id) count++ // 将count的值,给所有客户端都发一遍 socketio.emit('countmsg', count) // .... })
-
当服务端发现有客户端断开连接就需要让
count--
// 监听socket连接的断开, 一旦连接断开, count--, 再给所有客户端发一遍 socket.on('disconnect', ()=>{ count-- socketio.emit('countmsg', count) })
-
无论
count
如何变化, 只要count
有变化就需要将count
实时发给所有客户端. -
客户端接收服务端发过来的消息
countmsg
. 将人数实时显示在页面中.// 监听服务端发给客户端的count消息 实时在线人数 更新界面 socket.on('countmsg', (data)=>{ userNumber.innerHTML = data })
-
-
登录, 发消息时携带头像/昵称等参数.
一对一聊天的实现思路
-
客户端向服务端发送请求, 请求连接连接.
-
服务端一旦监听到连接的建立, 将连接对象与客户端id绑定在一起, 存起来.
-
客户端发消息时需要携带目标用户(发给谁):
{ name: 'zs', to:'目标id', avatar:'a.jpg', content:'消息' }
-
服务端接收到消息后, 解析出目标用户(目标id), 找到当时存储的
socket
对象, 调用socket.emit()
单独给它发消息即可. 发消息时注意消息内容:{from:'zs', content:'内容', avatar:'a.jpg'}
更多相关内容 -
-
Socket实现一对一聊天
2015-11-13 11:47:35使用Socket实现一对一聊天,包括客户端和服务端 -
Java网络编程,一对一聊天
2021-08-14 17:02:42要求:就是有2个类,其中一个客户端和一个服务端。要实现从客户端发消息,不仅在客户端,而且也要在服务端也显示。实现客户端和服务端之间的简单聊天。 代码:①----->QqFu类 import javax.swing.*; import java....Java网络编程,一对一聊天
**这个小任务是来自于B站,他的视频名字就是“Java实现实时聊天互动程序”**
要求:就是有2个类,其中一个客户端和一个服务端。要实现从客户端发消息,不仅在客户端,而且也要在服务端也显示。实现客户端和服务端之间的简单聊天。
代码:①----->QqFu类
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class QqFu extends JFrame implements ActionListener{ public static void main(String[] args){ new QqFu(); } // 说明:一个类需要页面的显示,则那个类要继承JFrame。 // 属性 // 文本域 private JTextArea jta; // 滚动条 private JScrollPane jsp; // 面板里面是文本框和按钮 private JPanel jp; private JTextField jtf; private JButton jb ; BufferedWriter bw = null; // 构造器 public QqFu(){ // 初始化上面的属性 jta = new JTextArea(); // 将文本域添加到滚动条中 jsp = new JScrollPane(jta); jp = new JPanel(); jtf =new JTextField(15); jb = new JButton("发送"); // 把按钮和文本框添加到面板中 jp.add(jtf); jp.add(jb); // 把滚动条和面板添加到JFrame中去 this.add(jsp,BorderLayout.CENTER); //这个设置在中间 this.add(jp,BorderLayout.SOUTH); //南 this.setTitle("qq聊天 客户端"); this.setSize(500,500); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); jb.addActionListener(this); // 回车点击事件 jtf.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { if((char)e.getKeyChar()==KeyEvent.VK_ENTER) { useVoid01(); } } }); try{ /*******客户端 TCP协议*********/ // 1.创建一个客户端的套接字(尝试连接) Socket socket = new Socket("127.0.0.1",8888); // 2.获取socket通道的输入流 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 3 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line = null; while((line = br.readLine()) !=null){ jta.append(line + "\n"); } // 3. 获取输出流 // 4.关闭流 socket.close(); /******************************/ }catch(Exception e){ e.printStackTrace(); } } public void actionPerformed(ActionEvent e){ useVoid01(); } public void useVoid01(){ // 1.获取文本框中需要发送的内容 String text = jtf.getText(); // 2. 拼接内容 text = "客户端对服务端说:" + text; // 3.自己显示 jta.append(text + "\n"); try{ // 4.发送 bw.write(text); bw.newLine(); // 换行 bw.flush(); // 刷新 // 5.清空 jtf.setText(""); }catch(IOException e1){ e1.printStackTrace(); } } //行为 }
代码:②----->QqMain类
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class QqMain extends JFrame implements ActionListener{ public static void main(String[] args){ new QqMain(); } // 说明:一个类需要页面的显示,则那个类要继承JFrame。 // 属性 // 文本域 private JTextArea jta; // 滚动条 private JScrollPane jsp; // 面板里面是文本框和按钮 private JPanel jp; private JTextField jtf; private JButton jb ; BufferedWriter bw = null; // 构造器 public QqMain(){ // 初始化上面的属性 jta = new JTextArea(); // 将文本域添加到滚动条中 jsp = new JScrollPane(jta); jp = new JPanel(); jtf =new JTextField(15); jb = new JButton("发送"); // 把按钮和文本框添加到面板中 jp.add(jtf); jp.add(jb); // 把滚动条和面板添加到JFrame中去 this.add(jsp,BorderLayout.CENTER); //这个设置在中间 this.add(jp,BorderLayout.SOUTH); //南 this.setTitle("qq聊天 服务端"); this.setSize(500,500); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); /***********TCP协议*************/ jb.addActionListener(this); // 这是按钮点击使用 // 回车键的监听事件 在接口KeyListener中 //jtf.addKeyListener(this); jtf.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { if((char)e.getKeyChar()==KeyEvent.VK_ENTER) { useVoid(); } } }); try{ // 1.创建一个服务端的套接字 ServerSocket serverSocket = new ServerSocket(8888); //2.等待客户端的连接 Socket socket = serverSocket.accept(); // 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine()) BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 4.获取通道的输入流(也是一行一行的写出 BufferedWriter ->newLine()) // 当用户点击“发送”按钮的时候才会,写出数据 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line = null; while((line = br.readLine()) !=null){ // 将读取的数据拼接到文本域中显示 jta.append(line + "\n"); } // 5.关闭socket通道 serverSocket.close(); }catch(IOException e){ e.printStackTrace(); } /************************/ } // 点击按钮所实现的方法 public void actionPerformed(ActionEvent e){ useVoid(); } public void useVoid(){ // 1.获取文本框中的内容 String text = jtf.getText(); text = "服务端对客户端说:" + text; // 自己显示 jta.append(text + "\n"); // 2.发送 try{ // 4.发送 bw.write(text); bw.newLine(); // 换行 bw.flush(); // 刷新 // 5.清空文本框 jtf.setText(""); }catch (IOException e1){ e1.printStackTrace(); } } /*public void KeyPressed(KeyEvent e){ //回车键 System.out.println("按钮数字"); } public void KeyTyped(KeyEvent e){ } public void KeyReleased(KeyEvent e){ }*/ //行为 }
效果展示:
这里面的什么通信协议我就是照着抄的,不过在这个里面还是可以学到一些东西的,对于swing的使用吧。里面的获取输入的内容,和输出获取的内容,还用那个清空。
-
vue+websocket+nodejs实现聊天室 -一对多、一对一聊天
2022-03-06 15:11:57前言:上篇我们讲了如何使用vue+websocket加nodejs搭建一个聊天室, 下面我们在该聊天室基础上增加了一对一单聊功能。支持一对一单聊,一对多群聊。 ...前言 上篇我们讲了如何使用vue + websocket + nodejs搭建一个聊天室, 下面我们在该聊天室基础上增加了一对一单聊功能。支持一对一单聊,一对多群聊。
先看效果:
大概思路:
主要通过参数brige区分是群聊还是单聊:
brige为空是群聊;
brige包含了当前登录人的uid还有聊天对应人的uid,是单聊。核心代码:
// 单聊 if (obj.brige && obj.brige.length) { obj.brige.forEach(item => { conns[item].sendText(JSON.stringify(obj)) }) return; } // 群聊(目前是默认写死的一个群) server.connections.forEach(function (conn) { // 注意:这里是server,不是ws conn.sendText(JSON.stringify(obj)) // 注意:这里得转成字符串发送过去,不然会报错。 })
流程图如下:
上代码:服务端:
const ws = require('nodejs-websocket') const moment = require('moment') let users = [] let conns = {} function broadcast(obj) { // 单聊 if (obj.brige && obj.brige.length) { obj.brige.forEach(item => { conns[item].sendText(JSON.stringify(obj)) }) return; } server.connections.forEach(function (conn) { conn.sendText(JSON.stringify(obj)) }) } const server = ws.createServer(function (conn) { conn.on('text', function (data) { const obj = JSON.parse(data) switch (obj.type) { case 1: { // 将所有uid对应的连接都保存到一个对象里 conns[obj.uid] = conn; // 不存在uid对应的用户(不是本人),才会添加,避免重复 const isSelf = users.some(m => m.uid === obj.uid) console.log(isSelf, data.uid, users, '所有用户') if (!isSelf) { users.push({ nickname: obj.nickname, uid: obj.uid }) } broadcast({ type: 1, nickname: obj.nickname, uid: obj.uid, msg: `${obj.nickname}进入了聊天室`, date: moment().format('YYYY-MM-DD HH:mm:ss'), users, brige: obj.brige }) } break; case 2: // 聊天时候不需要users,type为1已经处理了 broadcast({ type: 2, nickname: obj.nickname, uid: obj.uid, msg: obj.msg, users, date: moment().format('YYYY-MM-DD HH:mm:ss'), brige: obj.brige }) break; } }) conn.on('close', function (e) { console.log(e, '服务端连接关闭') }) conn.on('error', function (e) { console.log(e, '服务端异常') }) }).listen(8888) console.log('服务端已开启')
客户端:
视图层:(由之前的class为right改为现在web-im。多加了左侧菜单栏,其他地方跟上篇一致)
<div class="web-im"> <div class="left"> <div class="user" @click="triggerGroup()"> 群一 </div> <div class="user" v-for="(itm, idex) in users" :key="idex" v-show="itm.uid !== uid" @click="triggerUser(itm)"> <span>{{itm.nickname}}</span> </div> </div> <div class="right"> <div class="body im-record" id="im-record"> <p>{{title}}</p> <div class="ul"> <!-- user为靠右展示样式,如果uid一致说明是本人 --> <div class="li" :class="{user: item.uid == uid}" v-for="(item, index) in currentMessage" :key="index"> <template v-if="item.type===1"> <p class="join-tips">{{item.msg}}</p> </template> <template v-else> <p class="message-date"> <span class="m-nickname">{{item.nickname}}</span> {{item.date}}</p> <p class="message-box">{{item.msg}}</p> </template> </div> </div> </div> <div class="im-footer"> <el-input placeholder="请输入你想说的内容..." v-model="msg" class="im-footer_inp"/> <el-button class="im-footer_btn" type="primary" @click="send">发送</el-button> </div> </div> </div>
逻辑层:(之前是聊天框数组是messageList,现在改成currentMessage)
(注:…表示代码跟之前一致,这里不再多写)computed: { // 筛选当前brige一致的放到一个聊天数组里,区分单聊和群聊 currentMessage () { const vm = this let data = this.messageList.filter(item => { return item.brige.sort().join('') === vm.brige.sort().join('') }) return data } }, ... // 发送信息给客户端 sendMessage (type, msg) { const data = { uid: this.uid, type, nickname: this.nickname, msg, users: this.users, brige: this.brige } this.ws.send(JSON.stringify(data)) this.msg = '' }, // 切换到单聊 triggerUser (itm) { this.brige = [this.uid, itm.uid] this.title = `和${itm.nickname}聊天` }, // 切换到群聊 triggerGroup () { this.brige = [] this.title = '群聊' },
样式层:
.web-im { display: flex; } .left { width: 200px; border: 1px solid #ccc; .user { width: 100%; height: 36px; padding-left: 10px; border-bottom: 1px solid #ccc; line-height: 36px; .msgtip { display: inline-block; width: 20px; height: 20px; background: #46b0ff; margin-left: 5px; text-align: center; color: #fff; line-height: 20px; border-radius: 50%; } } } .right { position: relative; flex: 1; height: 600px; margin: 0 auto; .im-title { height: 30px; padding-left: 20px; border-bottom: 1px solid #ccc; line-height: 30px; font-size: 16px; } .im-footer { position: absolute; bottom: 0; left: 0; display: flex; width: 100%; .im-footer_inp { width: 80%; } .im-footer_btn { width: 20%; } } .im-record { width: 100%; height: 540px; overflow-y: auto; .join-tips { position: relative!important; display: block; width: 100%; left: 0!important; transform: none!important; color: #cccccc; font-size: 15px; text-align: center; } .li { position: relative; margin-bottom: 15px; text-align: left; color: #46b0ff; &:after { content: ''; display: block; clear: both; } .message-date { font-size: 16px; color: #b9b8b8; } .m-nickname { color: #46b0ff; } &.user { text-align: right; } } .message-box { line-height: 30px; font-size: 20px; } } }
-
一对一视频交友源码打造独特的一对一聊天系统
2018-11-30 12:50:45直播行业不断的演变到现在,手机直播、直播+短视频、微信小程序、短视频、一对一视频交友源码都在不断的占据市场和进行融资上市。 传统直播模式并不是所有观众都会打赏主播,但是一对一采用的是计时收费或者先付费的...直播行业不断的演变到现在,手机直播、直播+短视频、微信小程序、短视频、一对一视频交友源码都在不断的占据市场和进行融资上市。
传统直播模式并不是所有观众都会打赏主播,但是一对一采用的是计时收费或者先付费的方式,相当于主播有了一定的“底薪”,而用户照旧可以打赏主播,增加了主播和平台的收益,减轻了平台带宽的费用。
一对一视频交友源码相较于直播系统源码来讲,除了社交性、互动性、私密性及变现能力上更强之外,在应用的开发语言、系统框架及搭建部署内容方面与传统直播平台并没有太大的差别,无非就是一对一聊天系统的开播机制较为特别。
一对一视频交友源码也需要全面兼容Android及iOS终端,因此开发语言方面也用到了Java和objective-c。至于服务端的开发语言,则可以选择Java或者PHP。一对一视频交友源码包含的业务服务集群则主要有:socket集群,Redis集群,Mysql集群(支持主从读写分离)。当然也需要用到云存储及流媒体等三方服务。从这些方面来看,一对一视频交友源码的开发搭建与传统直播系统开发搭建并没有什么不同。
如果仅仅只是功能及变现方式上的差别,并不能说一对一视频交友源码是传统直播源码的升级版。但一对一聊天系统可以看作是直播系统在社交细分领域的全新应用,因为一对一聊天系统的模式私密社交性更强,同时也可以将一对一聊天系统单独作为功能模块嵌入很多社交平台中。
如果想入住一对一聊天系统市场一定要快速的上线运营,这个时候就要找专业做直播的合作商、程序代码扎实稳定、技术一对一对接、售后无忧:最好是实地公司当面考察。
-
利用websocket实现一对一聊天
2020-08-07 21:22:47一对一聊天websocket1. 效果展示2. 业务分析(逻辑展示...)3. 技术点 功能 即时发送消息||随时发送消息 历史消息显示 已读未读状态 1. 效果展示 由于没做登录,就以jack和rose两人聊天 两人可相互发消息 ... -
vue+django实现一对一聊天功能
2019-02-02 23:04:08vue+django实现一对一聊天和消息推送的功能。主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels。考虑到存储量的问题,我并没有把聊天信息存入数据库,服务端的作用相当于一个中转站。... -
WebSocket(3)---实现一对一聊天功能
2019-04-03 00:59:56实现一对一聊天功能 功能介绍:实现A和B单独聊天功能,即A发消息给B只能B接收,同样B向A发消息只能A接收。 本篇博客是在上一遍基础上搭建,上一篇博客地址:【WebSocket】---实现游戏公告功能。底部有源码。 先看... -
史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天
2019-08-22 11:23:42本文目录 1、概述 2、SignalR一对一聊天实现 2.1、 创建ASP.NET Mvc项目 2.2、安装Nuget包 2.3、一对一聊天后台代码实现### 2.4、一对一聊天前台代码实现### 3、效果展示 4、代码下载 5、参考文章 1、概述 通过前面... -
Python实现socket简单一对一聊天
2019-04-28 16:17:101.socket流程介绍 这里主要介绍以TCP为主的socket,即基于连接的会话,流程如图...用accept()函数接收来自客服端的请求,此时返回两个参数,一个是客户端的ip/port, 一个是客户端与服务端之间建立的连接,后续的通... -
微信小程序云开发实现一对一聊天
2019-10-27 12:12:18微信小程序云开发实现一对一聊天 有的时候小程序可以会涉及到聊天,评论的等功能,像博客,外卖平台等。这篇文章就先介绍的怎样借助云开发实现即时一对一,不同场景的聊天的功能。 首先要创建创建一个新的云开发的... -
Java websocket + redis 实现多人单聊天室,多人多聊天室, 一对一聊天
2017-08-18 09:15:17多人,单聊天室版 FEATURE 多人聊天, 界面简洁美观, 使用ueditor支持发送文字,图片信息群聊成员列表, 登入登出公告存储聊天记录, 查看历史消息 技术点 使用CopyOnWriteMap存储websocketServer... -
【原创】基于Springboot、WebSocket的一对一聊天室
2018-10-22 21:16:28基于Springboot、WebSocket、STOMP协议、SockJS协议的一对一聊天室 作者:SGCoder,转载需注明。 因为最近学校一个项目,需要实现与商家沟通的这么一个需求,所以经过一段时间的网上收集资料,了解到了要主动让... -
java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)
2017-08-03 21:06:53//创建一个接收连接客户端的对象 Socket socket = ss.accept(); System.out.println(socket.getInetAddress()+"已成功连接到此台服务器上。"); //字符输出流 pwtoclien = new PrintWriter(socket.... -
Netty 实现一对一客户端聊天(由服务器转发)
2018-05-21 15:49:37不满足客户端服务器一对一聊天,所以寻思着自己实现一个客户端和客户端一对一聊天,消息由服务器转发。 如果有代码写的不合适的地方,还请评论指正。 《Netty实战》电子书下载地址 主要思路 服务器端 服务器... -
JAVA--一对一聊天
2019-04-14 12:59:19实现一对一聊天,需要所有人都访问一个地址和端口,再把用户接受的信息都放在一个线程的类里面,用Client连接多个线程,实现多个用户端连接至服务端发送消息,再由服务器转发消息至客户端,并且在客户端显示出来。... -
Socket一对一聊天实例
2015-11-13 12:27:41使用Socket实现了一对一聊天功能,包括客户端和服务端的源码,可以正常运行。 -
一对一聊天实现步骤
2018-07-20 15:51:56一对一聊天实现步骤如下: 1:在FriendList中启动QqChat 线程: 2: 在QqChat 中new Message,将Message中的内容发送给服务器oos。问题来了,那么我怎么样取得客户端的socket呢?把QqClientConServer里面的... -
java+rabbitMQ实现一对一聊天
2018-03-06 21:46:18上一篇文章讲了RabbitMQ的安装 接下来介绍一下具体的应用...使用java + rabbitMQ实现聊天功能的demo , 非常有助于理解和上手rabbitMQ , 该demo仅限于用来学习rabbitMQ , 实际工作中实现聊天功能不推荐使用rabbitMQ... -
Android端一对一视频聊天系统功能实现方式
2019-05-27 18:13:06云豹直播作为优质的视频社交APP的源码提供商,旗下的云豹一对一视频聊天系统采用了腾讯直播技术,实现了高清晰度,低延迟的聊天体验,同时集成短视频的功能,带给用户清晰流畅的视频体验,极大提高了App的可玩性和... -
1对1直播源码开源系统,一对一视频聊天系统成品源码
2018-12-01 12:00:08正如直播源码那样,通过1对1直播源码可以快速搭建部署一个一对一视频聊天系统平台。而一对一视频聊天系统平台的功能具有更强的社交性,同时也有更加私密的直播体验。针对于1对1直播源码开源系统,这里有几点源码优势... -
隐私聊天工具有哪些?可以一对一聊天的软件
2021-10-18 15:10:02看到这个问题有的人可能会说就VX啊,私聊就属于一对一聊天,但不管是陌生人捡到手机,还是同事借你手机玩一下,还是被查岗,都会很容易看到你的聊天内容,重点是微信聊天记录删除了,还有办法找回来,这点来说就一点... -
java中socket实现一对一聊天
2017-08-16 16:36:46要求:使用socket实现简单聊天机器人功能,客户端发给服务端一句话,服务端返回一句话(可以是固定的”你好”,也可以是随机的),当客户端输入exit时结束对话。总体思想: 创建socket,指定端口 使用字节流实现... -
一对一视频聊天系统中三种聊天方式的功能应用代码详解
2018-12-07 11:08:15在一对一视频聊天系统中,聊天是必不可少的沟通方式,主播和用户可以根据多种方式进行聊天,其中视频聊天和语音聊天是最为广泛的应用方式,但文字聊天也是直播系统当中必不可少的功能模块。 private RecyclerView ... -
基于WebRtc实现安卓视频一对一聊天
2019-03-21 09:26:52WebRtc是谷歌2010年收购GlobalIPSolutions公司而获得的一项实时语音对话或视频对话的技术。...这一个月来对webrtc也稍微有点了解吧,特此写个博客纪念下,结合自己写的小Demo给刚入坑的新人一点建议。使用 -
用Netty实现简单的聊天:一对一匹配聊天
2018-04-25 21:38:37当另一个用户登录4.两个用户相互交流不会影响其他用户下面上代码pom.xml 添加netty的依赖<!-- netty --> <dependency> <groupId>io.netty</groupId> ... -
分享一个一对一直播自动聊天脚本保护生态高山流水核心JS源码
2021-07-06 19:07:59分享一个最近很火的项目,一对一直播自动打招呼脚本,保护生态r9和高山流水小精灵的JS核心代码 该源码是Auto.js编写,可以二次重构。可以直接打包运行 function 首页ui() { importClass(android.view.MenuItem);... -
一对一语音视频直播双端原生+php后台源码 社交交友APP匹配语音视频聊天即时通信源码
2021-12-04 09:58:44全新原生一对一社交软件 速度匹配 视频匹配语音匹配 即时通信产品 秒匹配 秒接通 独立资料卡页面 画面以及语音即时同步无延迟 动态可发(图片,语音,视频),私聊可送礼物,语音通话,视频通话,语音消息 已经图片... -
微信小程序云开发watch实现用户一对一实时聊天
2021-06-01 00:03:27首先看一下具体实现效果 -
(Agora声网)多人视频聊天应用的开发(二)一对一聊天
2018-06-08 16:38:12转载于:Android多人视频聊天应用的开发(二)一对一聊天-玖哥的书房-51CTO博客 http://blog.51cto.com/dongfeng9ge/2095626 在上一篇《Android多人视频聊天应用的开发(一)快速集成》中我们讨论了如何配置Agora...