Node.js实现PC端类微信聊天软件(五)
学习回顾
Socket.io
结合Express创建Socket.io服务器
const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
客户端进行连接
const url = `http://localhost:8008`
const socket = io(url)
url传参
//客户端
const url = `http://localhost:8008?user=${query}`
const socket = io(url)
//服务器端
const query = socket.handshake.query
//query.user === ${query}
进行通信
socket.emit
socket.emit(eventName [,... args] [,ack])
- eventName
- args
- ack
- return Socket
将事件发送到由字符串名称标识的套接字。可以包括任何其他参数。支持所有可序列化的数据结构,包括Buffer。
socket.on
socket.on(eventName,callback)
- eventName
- callback
- return Socket
为给定事件注册新的处理程序。
example
const socket = getState().connect.socket
const email = getState().login.email //1001@qq.com
socket.emit('will_close', email)
socket.on('will_close', (closeUser) => {
//closeUser 1001@qq.com
deleteSocket(closeUser)
})
完成的部分
完结篇,接下来的所有功能基本都可以用现在的套路来实现,都是基于socket.io来进行服务器端和客户端的通信
好友添加
添加好友的流程大概如下
- 搜索框进行添加请求
- 把信息发送到服务器
- 服务器转发到另一个客户端
- 通知栏显示通知
- 另一个客户端进行同意或拒绝响应发送到服务器
- 服务器转发到之前请求的客户端并在通知栏显示
- 搜索框进行添加请求
onChangeSearchInput主要是改变搜索框输入的state
//搜索好友框的container
const mapDispatchToProps = dispatch => ({
onChangeSearchInput: (event) => {
dispatch(searchInputChange(event.target.value))
},
handleAddFriend: () => {
dispatch(addFriend())
},
})
handleAddFriend才是处理好友添加请求
//添加好友的action
export const addFriend = () => (dispatch, getState) => {
const socket = getState().connect.socket
socket.emit('add_friend', {
origin: getState().login.email,
dest: getState().search.input,
})
}
- 服务器进行转发
服务器把添加好友的请求转发给另一个客户端
function sendFriendRequest({ origin, dest }, socket) {
mongonConnect
.then(db => findFriend(db, dest))
.then(() => {
const destUser = findSocketFromEmail(dest)
const mr = {
origin,
message: `Friend add request from ${origin}`,
}
destUser.socket.emit('add_friend_request', mr)
})
.catch((message) => {
if (message === USER_NO_EXIST) {
socket.emit('add_friend_response', USER_NO_EXIST_MESSAGE)
} else if (message === ADD_FRIEND_FAILED) {
socket.emit('add_friend_response', ADD_FRIEND_FAILED_MESSAGE)
}
})
}
- 另一个客户端进行响应,并发送到服务器
pick为客户端对好友请求做出的响应,true or false
export const responseMessage = pick => (dispatch, getState) => {
const response = {
pick,
info: {
origin: getState().login.email,
dest: getState().notification.originEmail,
},
}
const socket = getState().connect.socket
socket.emit('add_friend_response', response)
}
- 服务器接收到响应,进行数据库操作,并进行对进行请求的客户端回应
如果pick为真就代表同意添加好友
socket.on('add_friend_response', (data) => {
const desk = findSocketFromEmail(data.info.dest)
if (data.pick) {
addFriend(data.info.origin, data.info.dest, desk.socket)
} else {
desk.socket.emit('add_friend_response', ADD_FRIEND_BE_REJECTET)
}
})
添加好友的数据库操作
function addFriendService(origin, dest, socket) {
mongonConnect
.then(db => addFriend(db, { origin, dest }))
.then((message) => {
if (message === ADD_FRIEND_SUCCESS) {
socket.emit('add_friend_response', ADD_FRIEND_SUCCESS_MESSAGE)
}
})
.catch((message) => {
if (message === USER_NO_EXIST) {
socket.emit('add_friend_response', USER_NO_EXIST_MESSAGE)
} else if (message === ADD_FRIEND_FAILED) {
socket.emit('add_friend_response', ADD_FRIEND_FAILED_MESSAGE)
}
})
}
- 之前进行请求的客户端接收服务器端的响应,添加成功或者失败
socket.on('add_friend_response', (data) => {
const res = JSON.parse(data)
dispatch(newMessage(res))
})
总结
之后所有的操作包括聊天功能,朋友圈功能,基本都是按照这个套路基于socket.io进行通信来实现
进行action的描述,作为通过view层进行触发来和服务器通信(需要利用redux中间件),接收到服务器的消息后再进行dispatch更改view
reducer,通过dispatch来进行作用,通过action和当前state来改变state从而对view进行更新
先对需要的展示组件进行改造,改造成容器组件,可以对state进行操作,利用mapStateToProps,mapDispatchToProps,把state和dispatch映射到组件上,通过state的内容来动态展示和服务器交互的内容,使得可以通过view才来触发状态的改变
Node.js实现PC端类微信聊天软件(五)的更多相关文章
- Node.js实现PC端类微信聊天软件(四)
Github StackChat 学习回顾 React和Electron结合 TypeError: fs.existsSync is not a function 在React组件里引入electro ...
- Node.js实现PC端类微信聊天软件(一)
Github StackChat 技术栈 写这个软件StackChat的主要目的是巩固练习Node和对React的实践,也是为了学习东西,所以选用了这些自己还没在项目里使用过的技术,边学变写 Elec ...
- Node.js实现PC端类微信聊天软件(二)
Github StackChat 用到的React-Router React-Router是React路由的解决方案之一,也可以使用别的库 安装 npm install react-router -- ...
- Node.js实现PC端类微信聊天软件(三)
Github StackChat Redux学习回顾 Redux的主要功能就是管理复杂交错的State,比如需要讲state提升到顶层组件的场景中,使用Redux就很合适 Redux主要提供三个东西来 ...
- js 判断pc端或手机端
<script> (function () { var navUA = navigator.userAgent; var defIncludeStr = "iPhone|Andr ...
- Node.js系列:Buffer类的使用
客户端JavaScript中没有对二进制数据提供很好的支持.但是在处理TCP流或文件流时,必须要处理二进制数据.Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区. Buf ...
- Node.js之使用Buffer类处理二进制数据
Node.js之使用Buffer类处理二进制数据 Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区. 1. 创建Buffer对象 1.1 直接创建: ...
- react网页版聊天|仿微信、微博web版|react+pc端仿微信实例
一.项目介绍 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+nodejs等技术混合开发的仿微信web端聊天室react ...
- 基于Node.js+socket.IO创建的Web聊天室
这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...
随机推荐
- 解决popup不随着window一起移动的问题
原文:解决popup不随着window一起移动的问题 当我们设置Popup的StayOpen="True"时,会发现移动窗体或者改变窗体的Size的时候,Popup并不会跟随着一起 ...
- Effective C++:规定24:如果所有的单位都需要的参数类型转换,使用请做到这一点non-member功能
(一个) 如果一个class.同意整数"隐式转换为"有理数似乎非常合理. class Rational{ public: Rational(int numerator = 0, i ...
- [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛
大家好,我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 在前面的文章中.我们分别实现了一个自己定义的角色控制器<[Unity3D]Unity3D游戏开 ...
- 微软Insider Dev Tour 活动
总述 Insider Dev Tour 将在6月全球29个城市中展开.这次活动是通过与微软全球MVPs和RD合作进行的,并涵盖了微软最新的开者方面的最新消息. 日期提示 2018年5月7日 : 暂无其 ...
- LeapMotion Demo1
原文:LeapMotion Demo1 LeapMotion SDK For c# 只提供了一个Sample.cs. Leap Motion App Home 可以给初入手者提供很好的用户 ...
- [PHP7.0-PHP7.2]的新特性和新变更
php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...
- 【Ubuntu】查看系统资源占用(内存,cpu和进程)
1 top 查看ubuntu的资源占用的命令为 $: top 说明:top命令就可以查看内存,cpu和进程了,很方便 top: 主要参数: d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果 ...
- Mac OS启动服务优化高级篇(launchd tuning)禁用某些服务
http://kenwublog.com/mac-os-launchd-tuning Mac下的启动服务主要有三个地方可配置:1,系统偏好设置->帐户->登陆项2,/System/Libr ...
- C# 如何使用 Sql Server Compact 数据库
Sql Server Compact Edition(简称SqlCE)是一个轻量级的数据库,对于放在客户机上的程序而有需要存储数据这样的环境,使用SqlCE再合适不过了.SqlCE可以通过在VS(Vi ...
- 高启全:长江存储自主3D NAND,DRAM研发欢迎美光一起加入(千秋大业,慢慢做)
台湾DRAM教父高启全转战大陆紫光集团操盘存储器大计划超过1年,日前晋升长江存储的执行董事.代行董事长,接受DIGITIMES独家专访公开未来规划:他指出,已齐聚500名研发人员在武汉投入3D NAN ...