• webscoket学习


    webscoket基本使用 

    WebSocket - Web API 接口参考 | MDN

     使用node编写webscoket服务

    nodejs-webscoket 在github的地址↓ 

    GitHub - sitegui/nodejs-websocket: A node.js module for websocket server and client

    ws和socket.io 是wbscket的两个库

    仓库地址:learn-webscoket: webscoket学习 ,前台使用原生写法 基于 webscoket 类

    ws库+html 实现聊天

    后台使用的是ws库:

    1. const WebSocket = require('ws');
    2. const wss = new WebSocket.Server({ port: 8088 }); // websocket的端口
    3. let i = 0
    4. wss.on('connection', function connection(ws) {
    5. i++
    6. console.log("当前链接人数是" + i);
    7. ws.on('message', function incoming(message) {
    8. console.log('服务端接受到数据:', message);
    9. message = message.toString()
    10. // console.log(message.toString());
    11. // 广播给所有用户
    12. wss.clients.forEach(function each(client) {
    13. if (client.readyState === WebSocket.OPEN) {
    14. // client.send(JSON.stringify(message));
    15. client.send(message);
    16. }
    17. });
    18. });
    19. // ws.send('something');
    20. });

    前台 基于WebSocket 类实现:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. style>
    10. head>
    11. <body>
    12. <input id="message-text" type="text">
    13. <button id="send">发送button>
    14. <button id="close">关闭button>
    15. <div id="message-list">div>
    16. body>
    17. <script type="text/javascript">
    18. var ws = new WebSocket('ws://localhost:8088');
    19. ws.onopen = function (evt) { // 连接建立触发
    20. console.log('建立连接,状态:' + ws.readyState);
    21. };
    22. ws.onmessage = function (evt) { // 服务端返回数据触发
    23. // console.log(String.toString(evt.data));
    24. var data = JSON.parse(evt.data)
    25. console.log(data);
    26. console.log("状态:" + ws.readyState + ";服务端返回数据:", data);
    27. var list = document.getElementById("message-list");
    28. list.insertAdjacentHTML("beforeEnd", `
      ${data.message}
      `
      );
    29. };
    30. ws.onerror = function (evt) { // 通信发生错误触发
    31. console.log(evt);
    32. console.log('发生错误,状态:' + ws.readyState);
    33. };
    34. ws.onclose = function (evt) { // 连接关闭触发
    35. console.log(evt);
    36. console.log("连接关闭,状态:", ws.readyState);
    37. };
    38. document.getElementById("send").onclick = function () {
    39. var val = document.getElementById("message-text").value
    40. var data = {
    41. message: val
    42. }
    43. console.log(data);
    44. ws.send(JSON.stringify(data)); // 推送数据到服务器, 数据类型必须为字符串
    45. // console.log('我发送成功了');
    46. }
    47. document.getElementById("close").onclick = function () {
    48. ws.close(); // 关闭连接
    49. }
    50. script>
    51. html>

    socket.io + html实现聊天(群聊)

    参考:scoket.io实现群聊、私聊_小宇宙chris_310的博客-CSDN博客_scoketio

    js部分:

    1. const app = require('express')()
    2. const http = require("http").Server(app);
    3. const io = require("socket.io")(http,{
    4. cors:true
    5. });
    6. http.listen(3000, () => {
    7. console.log(`服务启动成功,地址是 http://127.0.0.1:3000`);
    8. })
    9. console.log(__dirname);
    10. app.get('/', (req, res) => {
    11. res.sendFile(__dirname + '/groupChat.html')
    12. })
    13. io.on("connection", (socket) => {
    14. console.log('用户建立了链接');
    15. // 接收客户端发来的数据
    16. socket.on('chat message', function (msg) {
    17. console.log('message:' + msg);
    18. io.emit('receiveMessage', msg)
    19. })
    20. // 如果是断开socket请求,就会触发下面的代码
    21. socket.on('disconnect', function () {
    22. console.log('user disconnect')
    23. })
    24. });

    html部分:

    1. html>
    2. <html>
    3. <head>
    4. <title>Socket.IO chattitle>
    5. <style>
    6. * {
    7. margin: 0;
    8. padding: 0;
    9. box-sizing: border-box;
    10. }
    11. body {
    12. font: 13px Helvetica, Arial;
    13. }
    14. form {
    15. background: #000;
    16. padding: 3px;
    17. position: fixed;
    18. bottom: 0;
    19. width: 100%;
    20. }
    21. form input {
    22. border: 0;
    23. padding: 10px;
    24. width: 80%;
    25. margin-right: .5%;
    26. }
    27. form button {
    28. width: 19%;
    29. background: rgb(130, 224, 255);
    30. border: none;
    31. padding: 10px;
    32. }
    33. #messages {
    34. list-style-type: none;
    35. margin: 0;
    36. padding: 0;
    37. }
    38. #messages li {
    39. padding: 5px 10px;
    40. }
    41. style>
    42. head>
    43. <body>
    44. <ul id="messages">
    45. ul>
    46. <form action="">
    47. <input id="m" autocomplete="off" /><button>Sendbutton>
    48. form>
    49. body>
    50. <script src="/socket.io/socket.io.js">script>
    51. <script>
    52. // 这样就加载了 socket.io-client。 socket.io-client 暴露了一个 io 全局变量,然后连接服务器。
    53. //请注意我们在调用 io() 时没有指定任何 URL,因为它默认将尝试连接到提供当前页面的主机。
    54. var username = prompt('请输入用户名')
    55. var socket = io('http://127.0.0.1:3000');
    56. var form = document.querySelector('form');
    57. var val = document.querySelector('#m');
    58. var messages = document.querySelector('#messages')
    59. // var messages=document.querySelector('#messages')
    60. form.onsubmit = function () {
    61. var obj = {
    62. username: username,
    63. mes: val.value
    64. }
    65. socket.emit('chat message', JSON.stringify(obj));
    66. // messages.innerHTML += `
    67. //
    68. ${val.value}
  • // `;
  • val.value = '';
  • // console.log(obj);
  • // console.log(messages);
  • return false;//阻止表单默认行为
  • }
  • //接收后端发来的消息
  • socket.on('receiveMessage', function (data) {
  • // console.log(data);
  • var obj = JSON.parse(data);
  • if (obj.username == username)
  • //不渲染自己发送的消息
  • return;
  • //渲染别人发送的消息
  • messages.innerHTML += `
  • ${obj.username}:${obj.mes}
  • `;
  • })
  • script>
  • html>
  • socket.io + html实现聊天(私聊)

    js部分:

    1. const app = require('express')(); // 获取express模块实例
    2. const http = require('http').Server(app); // 将express模块实例作为回调构建http模块实例
    3. const io = require('socket.io')(http, {
    4. cors: true
    5. }); // 将http模块实例作为回调构建socket.io模块实例
    6. // 使用http模块开启后端服务(原生node+express的结合)
    7. http.listen(3000, function () {
    8. console.log('listening on http://127.0.0.1:3000')
    9. })
    10. // 设置路由,构建后端接口
    11. app.get('/', function (req, res) {
    12. res.sendFile(__dirname + '/privateChat.html'); // 将根目录下的index.html发送到前端
    13. })
    14. var users = {}; // 保存所有用户的键值对集合
    15. io.on('connection', function (socket) {
    16. socket.on('con', function (msg) {
    17. var obj = JSON.parse(msg) // 获取连接的用户信息
    18. users[obj.username] = socket.id; // 将当前用户名和对应的链接id进行保存
    19. console.log('有新的链接,最新用户集合为:', users)
    20. })
    21. // 接收客户端发来的数据
    22. socket.on('chat message', function (msg) {
    23. var obj = JSON.parse(msg) // 获取连接的用户信息
    24. console.log('obj:', obj)
    25. if (users[obj.toWho] == undefined) {
    26. let respmes = {
    27. usernamez: '系统信息',
    28. mes: '抱歉【' + obj.toWho + '】还未上线'
    29. }
    30. io.to(socket.id).emit('receiveMessage', JSON.stringify(respmes)); // 将消息发给当前用户
    31. } else { // 说明目标用户存在
    32. let respmes = {
    33. usernamez: obj.username,
    34. mes: obj.mes
    35. }
    36. io.to(users[obj.toWho]).emit('receiveMessage', JSON.stringify(respmes)); // 通过id将信息转发给指定的对象
    37. }
    38. })
    39. // 如果是断开socket请求,就会触发下面的代码
    40. socket.on('disconnect', function () {
    41. console.log('user disconnected')
    42. })
    43. })

    html部分:

    1. <html>
    2. <head>
    3. <title>Socket.IO chattitle>
    4. <style>
    5. * {
    6. margin: 0;
    7. padding: 0;
    8. box-sizing: border-box;
    9. }
    10. body {
    11. font: 13px Helvetica, Arial;
    12. }
    13. form {
    14. background: #000;
    15. padding: 3px;
    16. position: fixed;
    17. bottom: 0;
    18. width: 100%;
    19. }
    20. form input {
    21. border: 0;
    22. padding: 10px;
    23. width: 80%;
    24. margin-right: .5%;
    25. }
    26. form button {
    27. width: 19%;
    28. background: rgb(130, 224, 255);
    29. border: none;
    30. padding: 10px;
    31. }
    32. #messages {
    33. list-style-type: none;
    34. margin: 0;
    35. padding: 0;
    36. }
    37. #messages li {
    38. padding: 5px 10px;
    39. }
    40. style>
    41. head>
    42. <body>
    43. <script src="https://cdn.socket.io/4.5.4/socket.io.min.js"
    44. integrity="sha384-/KNQL8Nu5gCHLqwqfQjA689Hhoqgi2S84SNUxC3roTe4EhJ9AfLkp8QiQcU8AMzI"
    45. crossorigin="anonymous">script>
    46. <script>
    47. // 这样就加载了 socket.io-client。 socket.io-client 暴露了一个 io 全局变量,然后连接服务器。
    48. //请注意我们在调用 io() 时没有指定任何 URL,因为它默认将尝试连接到提供当前页面的主机。
    49. window.onload = function () {
    50. var username = prompt("请输入你的用户名:", "");
    51. var who = prompt("你要和谁聊天?:", "");
    52. document.body.innerHTML = `

      当前用户:${username}, 和${who}聊天中...

      `
      + document.body.innerHTML;
    53. var socket = io("http://localhost:3000/");
    54. var form = document.querySelector("form");
    55. var val = document.querySelector("#m");
    56. //先和服务端建立连接
    57. let conobj = {
    58. username: username,
    59. toWho: who,
    60. }
    61. socket.emit('con', JSON.stringify(conobj));
    62. //表单提交事件
    63. form.onsubmit = function () {
    64. let obj = {
    65. username: username,
    66. toWho: who,
    67. mes: val.value
    68. }
    69. socket.emit('chat message', JSON.stringify(obj));
    70. // messages.innerHTML += `
    71. //
    72. ${val.value}
    73. `;
  • val.value = "";
  • return false;
  • }
  • //接收后端发来的消息
  • socket.on("receiveMessage", function (data) {
  • var obj = JSON.parse(data);
  • console.log(obj)
  • if (obj.username == username) return; //不接受自己发的消息
  • messages.innerHTML += `
  • ${obj.usernamez}:${obj.mes}
  • `;
  • })
  • }
  • script>
  • <ul id="messages">ul>
  • <form action="">
  • <input id="m" autocomplete="off" /><button>Sendbutton>
  • form>
  • body>
  • html>
  • 相关阅读:
    uniapp 微信小程序 vue3.0+TS手写自定义封装步骤条(setup)
    [附源码]计算机毕业设计springboot课程在线测评系统
    Epuck2机器人固件更新及IP查询
    Java日志系列——日志门面,阿里日志规约,SLF4J
    Vue.js 路由时用于提高应用程序性能
    Flutter的Event Loop
    K近邻算法实例
    树形DP()
    Linux Centos7安装后,无法查询到IP地址,无ens0,只有lo和ens33的解决方案
    戴尔G3-3579改固态散热
  • 原文地址:https://blog.csdn.net/weixin_60968779/article/details/127327875