vue+node.js+socket.io+express 一对一聊天

JavaScript015

vue+node.js+socket.io+express 一对一聊天,第1张

node.js

npm install socket.io

第一:node.js服务器端

基于node.js和express

const express = require('express')

const app = express()

const query=require('./mysql/connect')

const port = 2000

const pddUrl = 'http://192.168.1.178'

var server = require('http').Server(app)

var io = require('socket.io')(server)

const bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({

    extended:true

}))

//设置跨域访问

app.all("*",function(req,res,next){

    //设置允许跨域的域名,*代表允许任意域名跨域

    res.header("Access-Control-Allow-Origin","*")

    //允许的header类型

    res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild')

    //跨域允许的请求方式

    res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS")

    if (req.method.toLowerCase() == 'options')

        res.send(200)  //让options尝试请求快速结束

    else

        next()

})

app.get('/', function(req, res){

    res.send('<h1>你好web秀</h1>')

})

/*开始*/

let arrAllSocket = []

io.on('connection',function(socket) {

    /***********加入聊天****************/

    //obj模型

   /*

   obj={

      username: this.xvalue,

      userid:"fs",

      password: 'password'

   }

   */

    socket.on('join', function (obj) {

        console.log(obj.userid+'join')

        arrAllSocket[obj.userid] = socket

    })

    /***********************************/

    /****** 接收某人发送的消息*********/

    socket.on('sendmsg', function (data) {

        console.log(data)

        let target = arrAllSocket[data.userid]

        let res = {

            code: 200,

            msg:data.username,

            self:true,

        }

        if (target) {

            //发送信息至指定的人

            target.emit('receivemsg', res)

            console.log(res)

        }

    })

    /************监听用户退出***************/

    socket.on('disconnecta', function(data){

        let res = {

            code: 200,

            msg:`${data.userid}已退出聊天室`,

            self:true,

        }

        io.emit('logout',res)

        console.log(data.userid+'退出了聊天室')

    })

})

server.listen(port,() =>console.log(`Example app listening on port ${pddUrl}:${port}`))

第二步:a页面-----客户

1.安装依赖

npm install vue-socket.io --save

2.在main.js中引入

import VueSocketIO from 'vue-socket.io'

Vue.use(new VueSocketIO({

    debug: true,

    connection: 'xx',//这是路径比如: http://192.168.1.17 8

    vuex: {},

}))

3.在页面

<template>

    <div>

      <div>

        <p>聊天窗口</p>

        <div id="chatContent">

        </div>

      </div>

      <div>

        <input v-model="xvalue" />

        <button @click="Getvabk">发送</button>

        <button @click="Getbackvabk">退出</button>

      </div>

    </div>

</template>

<script>

    export default {

        name: "Mypersonal-zxlx",

      data(){

        return{

          fslista:[],

          jsLista:[],

          xvalue:'',

        }

      },

      created() {

      },

      mounted() {

        //发送信息给服务端

        this.$socket.emit('join',{

          username: this.xvalue,

          userid:"fs",//这个是你的id

          password: 'password'

        })

      },

      sockets: {

        connection() {

          //加入聊天

          this.$socket.emit('join',{

            username: this.xvalue,

            userid:"fs",//这个是你要聊天对方的id

            password: 'password'

          })

        },

        receivemsg(data) {                                 //监听receivemsg事件,方法是后台定义和提供的

          console.log(data)

          this.cs(data)

        },

        logout(data) {                                 //监听logout事件,方法是后台定义和提供的

          console.log(data)

          this.cs(data)

        },

      },

      methods:{

        Getbackvabk(){

          this.$socket.emit('disconnecta',{

            username: this.xvalue,

            userid:"fs",

            password: 'password'

          })

        },

        Getvabk(){

          //发送信息给服务端

          this.$socket.emit('sendmsg',{

            username: this.xvalue,

            userid:"js",

            password: 'password'

          })

        },

          cs(data){

            let chatContent = document.getElementById('chatContent')

            let newMsg = document.createElement('div')

            let msgContent = document.createElement('span')

            newMsg.append(msgContent)

            msgContent.innerText = data.msg

            newMsg.classList.add('self-msg')

            chatContent.append(newMsg)

          }

      }

    }

</script>

<style scoped>

</style>

第三步:b页面------客服端口

<template>

<div>

  cs

  <div>

    <p>聊天窗口</p>

    <div id="chatContent">

    </div>

  </div>

  <div>

    <input v-model="xvalue" />

    <button @click="Getvabk">发送</button>

  </div>

</div>

</template>

<script>

    export default {

        name: "cs",

      data(){

          return{

            xvalue:""

          }

      },

      created() {

      },

      mounted() {

        this.$socket.emit('join',{

          username: this.xvalue,

          userid:"js",//对于客服来说这是客服的id

          password: 'password'

        })

      },

      sockets: {

        connection() {

          this.$socket.emit('join',{

            username: this.xvalue,

            userid:"js",

            password: 'password'

          })

        },

        receivemsg(data) {                                 //监听message事件,方法是后台定义和提供的

          console.log(data)

          this.cs(data)

        },

        logout(data) {                                 //监听message事件,方法是后台定义和提供的

          console.log(data)

          this.cs(data)

        },

      },

      methods:{

        Getvabk(){

          //发送信息给服务端

          this.$socket.emit('sendmsg',{

            username: this.xvalue,

            userid:"fs",////对于客服来说这是客户的id

            password: 'password'

          })

        },

        cs(data){

          let chatContent = document.getElementById('chatContent')

          let newMsg = document.createElement('div')

          let msgContent = document.createElement('span')

          newMsg.append(msgContent)

          msgContent.innerText = data.msg

          newMsg.classList.add('self-msg')

          chatContent.append(newMsg)

        }

      }

    }

</script>

<style scoped>

</style>

--------------------------end结束-------------------

发现一款强大的开源聊天框架 Spika 。 它不仅提供iOS,Android,Web端的源码,还有后端的源码,都是开源的。Spika的提供者是来自克罗地亚的一家移动APP公司 Clover Studio 感谢他们的团队把这个项目从头到脚都开源了。

相对于传统的LAMP(LINUX, APACHE, MYSQL,PHP), Node.js + MongoDB 是一种比较新的后端组合。Google自己的聊天平台Google Messaging Cloud(GMC)就是基于Node.JS+MongoDB实现的。

废话不多说,开始使用吧!

安装服务器端

1.环境配置。 官网 上提供的是Ubuntu14.04版的配置过程。见下图:

由于我用的服务器是Amazon Linux,用yum来安装。

git clone git://github.com/nodejs/node.git

cd node

git checkout v4.4.7

./configure

make

sudo make install

sudo su

vi /etc/sudoers

:/usr/local/bin```

3.安装imagemagick

5.安装Spika

6.安装gulp

sudo npm install gulp -g

7.编写配置文件

把Config.host和port的值设为自己服务器的hostname和port, 把Config.chatDatabaseUrl的值改为mongoDB的路径。最好用1024以上的port。mongoDB如果没有修改安全选项的话,最好用127.0.0.1。

8 . 运行项目

这时候可能会报错

找不到jsdoc。 解决方法:

然后再次运行

开启服务器

node src/server/main.js

这个时候用浏览器登陆

主机号:端口号/spika

就可以开始聊天啦!

除了web版,它还有android和ios版,下次再尝试吧:)