Github StackChat

学习回顾

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来进行服务器端和客户端的通信

好友添加

添加好友的流程大概如下

  1. 搜索框进行添加请求
  2. 把信息发送到服务器
  3. 服务器转发到另一个客户端
  4. 通知栏显示通知
  5. 另一个客户端进行同意或拒绝响应发送到服务器
  6. 服务器转发到之前请求的客户端并在通知栏显示

  • 搜索框进行添加请求

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进行通信来实现

  1. 进行action的描述,作为通过view层进行触发来和服务器通信(需要利用redux中间件),接收到服务器的消息后再进行dispatch更改view

  2. reducer,通过dispatch来进行作用,通过action和当前state来改变state从而对view进行更新

  3. 先对需要的展示组件进行改造,改造成容器组件,可以对state进行操作,利用mapStateToProps,mapDispatchToProps,把state和dispatch映射到组件上,通过state的内容来动态展示和服务器交互的内容,使得可以通过view才来触发状态的改变

Node.js实现PC端类微信聊天软件(五)的更多相关文章

  1. Node.js实现PC端类微信聊天软件(四)

    Github StackChat 学习回顾 React和Electron结合 TypeError: fs.existsSync is not a function 在React组件里引入electro ...

  2. Node.js实现PC端类微信聊天软件(一)

    Github StackChat 技术栈 写这个软件StackChat的主要目的是巩固练习Node和对React的实践,也是为了学习东西,所以选用了这些自己还没在项目里使用过的技术,边学变写 Elec ...

  3. Node.js实现PC端类微信聊天软件(二)

    Github StackChat 用到的React-Router React-Router是React路由的解决方案之一,也可以使用别的库 安装 npm install react-router -- ...

  4. Node.js实现PC端类微信聊天软件(三)

    Github StackChat Redux学习回顾 Redux的主要功能就是管理复杂交错的State,比如需要讲state提升到顶层组件的场景中,使用Redux就很合适 Redux主要提供三个东西来 ...

  5. js 判断pc端或手机端

    <script> (function () { var navUA = navigator.userAgent; var defIncludeStr = "iPhone|Andr ...

  6. Node.js系列:Buffer类的使用

    客户端JavaScript中没有对二进制数据提供很好的支持.但是在处理TCP流或文件流时,必须要处理二进制数据.Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区. Buf ...

  7. Node.js之使用Buffer类处理二进制数据

    Node.js之使用Buffer类处理二进制数据 Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区. 1. 创建Buffer对象 1.1 直接创建: ...

  8. react网页版聊天|仿微信、微博web版|react+pc端仿微信实例

    一.项目介绍 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+nodejs等技术混合开发的仿微信web端聊天室react ...

  9. 基于Node.js+socket.IO创建的Web聊天室

    这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...

随机推荐

  1. kbmmw 中XML 操作入门(跨平台,而且可以与JSON,YAML,BSON 直接互相转换)

    delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...

  2. DNS查询工具:host、nslookup、dig

    作者:zhanhailiang 日期:2014-11-01 1. host host提供域名到IP地址的双向解析: host默认通过/etc/resolv.conf读取Name Server来解析,除 ...

  3. windows下编译qt的mysql驱动

    windows下编译qt的mysql驱动cd %QTDIR%\src\plugins\sqldrivers\mysqlqmake –o Makefile INCLUDEPATH+="C:\M ...

  4. Windows 编译libcurl(openssl+zlib)(使用VC编译)

    libcurl主要功能就是用不同的协议连接和沟通不同的服务器,如果使用HTTPS,需要OpenSSL libcurl https://curl.haxx.se/download.html 下载Sour ...

  5. delphi之多线程编程(尚未学习)

    本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...

  6. [GEiv]第七章:着色器 高效GPU渲染方案

    第七章:着色器 高效GPU渲染方案 本章介绍着色器的基本知识以及Geiv下对其提供的支持接口.并以"渐变高斯模糊"为线索进行实例的演示解说. [背景信息] [计算机中央处理器的局限 ...

  7. WPF 动态模拟CPU 使用率曲线图

    原文:WPF 动态模拟CPU 使用率曲线图      在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图.但是如果基础数据频繁更改, ...

  8. C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...

  9. 天气预报API接口

    原文:天气预报API接口 一.中央气象台API接口: 1. XML接口 http://flash.weather.com.cn/wmaps/xml/china.xml 这个是全国天气的根节点,列出所有 ...

  10. wpf VisualBrush 的使用,可创建重复图像

    VisualBrush 类(msdn) <Grid.Background> <VisualBrush TileMode="Tile" Viewport=" ...