webSocket基本使用,实现聊天功能

gitee代码地,址链接,两套都有gitee代码地,址链接,两套都有gitee代码地,址链接,两套都有

基本介绍(教程代码在下方)

socket.io 使用一个WebSocket库,前端能用后端也能的用一个库(只针对javascript语言),它的作用是为了完成实时通信,也就是是能够进行实时的双向通讯,主要应用场景有实时的聊天,数据实时分析,数据传输,文件协同合作,而我研究该技术原因是因为项目需要,不过目前在im和websocket之间犹豫。好了废话不多说。

简易代码在最下方(包含原生的html, js, nodejs, koa2代码)

socket.io的特点(官方介绍)

性能优异

在大多数情况下,将使用WebSocket建立连接,从而在服务器和客户端之间提供低开销的通信通道。

可靠性

请放心!如果WebSocket连接不可行,它将返回到HTTP长轮询。如果连接丢失,客户端将自动尝试重新连接。

可扩展

轻松扩展到多个服务器并将事件发送到所有连接的客户端。

常见错误

1、只报一个错误,后端没有任何反应

这个情况有可能是你的前后端口不一样

 2、报错两个,明显显示跨域问题,这个让人有点头大,不过不用担心,socket.io可以配置的

let ws = require("socket.io"); 

//启动websocket服务,挂载到web服务器之上,cors后台解决跨域
let io = ws(server, { cors: true });

如果配置了还没作用那有可能是你这个只配置的问题,这个6869才是你的端口

 3、最坑的来了。这个问题给我整的一脸闷逼(nodejs报错) koa2会遇到这个

 这个问题解决方案就是因为这个值是空的才导致的

结果展示

王五:

 

张三:

客户端代码(完整代码)

我就用原生的代码简单的写了一下

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>聊天</title>
</head>

<body>
    <h1>聊天</h1>
    <input type="text" id="user"> <br><br>
    <textarea id="text"></textarea>
    <button id="btn">发送消息</button>
</body>
<script src="https://cdn.bootcdn.net/ajax/libs/socket.io/3.0.0-rc4/socket.io.js"></script>
<script type="text/javascript">
    let socket = io.connect("172.16.5.8:5000");//html 端口
    var myMes = "";
    var myUser = "";
    document.getElementById("btn").onclick = function () {
        let mes = document.getElementById("text").value;//获取文本输入框的值
        let user = document.getElementById("user").value;//获取当前用户
        if (!mes || !user) {
            return;
        } else {
            myMes = mes;
            myUser = user;
            socket.send({ mes, user });//发送消息给服务器
            document.getElementById("text").value = "";
            document.getElementById("user").value = "";
        }
    };
    //当服务器广播消息的时候 会触发一个消息事件并且广播的消息会存在于回调中
    socket.on("message", function (mes) {
        console.log("触发时机");
        let p = document.createElement("p");
        p.innerText = `${mes.user === myUser ? "我" : mes.user}  说:  ${mes.mes}`;
        if (mes.user === myUser) {
            p.style.cssText = "color:red;font-weight:bold"
        }
        document.body.appendChild(p);
    })
</script>

</html>

服务端代码(完整代码)

一个是原生的一个是提供给koa2矿用户使用的

1、原生

let http = require("http");
let fs = require("fs");
let ws = require("socket.io");
let server = http.createServer();
let io = ws(server, { cors: true });//启动websocket服务,挂载到web服务器之上
//ws io服务器监听到用户的连接事件
console.log("持续请求123");
io.on("connection", function (socket) {
    console.log("用户请求进入聊天室");
    //监听到socket当中的消息发送事件
    socket.on("message", function (mes) {
        io.emit("message", mes); //发送消息事件

    })
});
server.listen(5000);

2、koa2

2-1 我们直接在bin目录下 www文件引入socket.io并使用就可以完成通信了

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http');
let ws = require("socket.io");
/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '5000');



// app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app.callback());
let io = ws(server, { cors: true });//启动websocket服务,挂载到web服务器之上
//ws io服务器监听到用户的连接事件
console.log("持续请求123");
io.on("connection", function (socket) {
  console.log("用户请求进入聊天室");
  //监听到socket当中的消息发送事件
  socket.on("message", function (mes) {
    //如果没有注明发给谁,那就是广播
    io.emit("message", mes); //发送消息事件

  })
});
/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

后期我也会去研究一下socket更深入的东西,到时候再分享给大家

完美结束,完结撒花

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值