带你掌握webSocket 和 socket.io的基本用法

这篇具有很好参考价值的文章主要介绍了带你掌握webSocket 和 socket.io的基本用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

两者的作用和区别

作用:使得前后端可以随时地相互沟通。什么是互相沟通呢?像网络请求这种就是客户端向服务端的单向的沟通,当然,网络请求也可以实现双向的沟通,比如ajax 轮询,就是浏览器开个定时器不断的发送请求来了解后端数据库中数据是否变化,但是这个性能和方式好像不太好。
区别:看来自socket.io官网的一句话。
socket.io websocket,websocket,前端,javascript,socket.io简单理解就是,socket.io主要是基于webSocket实现的,然后做了一些封装和优化吧,嗯。下面直接用两个聊天的案例来带你掌握webSocket socketIo

webSocket的使用(html+nodeJs)

就我当前学到的,做聊天的话,webSocket主要做群聊吧,只要连接了就能接到消息。这个依赖于一个第三方包,所以需要先安装,yarn add ws,我安装的版本是8.12.1

服务端代码。这里采用nodeJS来编写一个webSocket服务,代码如下:

const websocket=require("ws")

const server=new websocket.Server({port:6688},()=>{
    console.log('websocketServer is running in ws://localhost:6688');
})

server.on("connection",(Ws)=>{  //用户连接时调用
    console.log('hello new user')
    
Ws.on("message",(data)=>{
    //   console.log(data),可以看到传输过来的数据转buffer了
    let msg
      try {
        const info=JSON.parse(data.toString())
        const words=info.msg
        const name=info.name
        msg=words&&name ?`${name}${words}`:"消息解析失败,请联系管理员!"
      } catch (err) {
        msg=data.toString()
      }
      server.clients.forEach((user)=>{  
        if(user.readyState===websocket.OPEN){    // websocket.OPEN值为1,表示用户已连接且可以正常通信
            user.send(msg)        // 把消息发送给连接本ws服务的代码端
            // user.timeout(500).send(msg)        // 500ms后发送
        }
    })
    // console.log(server.clients);
    })
})

编写完后,比如该文件名为 webSocketServer.js,我们就是在终端使用指令node webSocketServer启动该服务即可,这样客户端那边就能连接该服务了。

前端代码。api不多,可参考代码注释

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <style>
    #allmsg{
        width: 300px;
        height: 250px;
        border: 1px solid black;
        overflow: auto;
    }
    #txtinput{
        width: 150px;
        height: 40px;
    }
    </style>
</head>
<body>
<h2>聊天社区</h2>
请输入当前登录用户的昵称:<input type="text" id="userName">
<p style="font-size:22px;">消息框</p>
<div id="allmsg"></div><br/><br/><br/>
<input type="text" name="" id="txtinput" placeholder="按回车发送消息">

<script>
const ws=new WebSocket("ws://localhost:6688")
const txtinput=document.getElementById("txtinput")
const allmsg=document.getElementById("allmsg")
const userName=document.getElementById("userName")
let user=null

userName.onblur=(e)=>{
    if(e.target.value)
    user={id:Math.random()+Date.now(),name:e.target.value}
    else user=null
}

txtinput.onkeyup=(e)=>{
    if(e.keyCode===13)      // 通知socket切换房间
    {
     if(!user) {alert("请输入当前登录用户的昵称!");return}
     if(!txtinput.value) return
      ws.send(JSON.stringify({...user,msg:txtinput.value}))  // 向服务器发送消息 。ws.close() - 关闭连接
      txtinput.value=""
    }
}

ws.onopen=()=>{       //自己连接服务器成功时回调
    ws.send("新用户加入聊天室")
}

ws.onmessage=(msg)=>{  // 接到服务器的消息时回调
  allmsg.innerHTML+=`<p>${msg.data}</p>`
}
ws.onerror=(err)=>{     // 出错时回调
  console.log(err);
}
ws.onclose=()=>{       // 连接关闭时回调
    console.log('disconnection');
}
</script>
</body>
</html>

此时,我们就可以在该html页面open with live server3次或者更多来开多个页签,这样就可以开始测试聊天了。效果展示如下:

chat_webSocket

socket.io的使用(html+nodeJs)

由于socket.io丰富的api,可以用它来实现群聊或者私聊。这个依赖于两个第三方包,所以需要先安装
yarn add socket.io express,我安装的socket.io的版本是4.6.1

服务端代码。这里采用nodeJS来编写一个socketIO服务,代码如下,具体使用看注释

const server=require("http").createServer(require("express")())
const io=require("socket.io")(server,{cors:true})  //创建io并允许跨域

io.on("connection",(socket)=>{  //有用户连接时回调
io.emit("msg","有新用户加入群聊室")
// io.local.emit("hello", "world");  //只向连接到当前服务器的客户端发送

// 客户端 emit("msg")时回调
socket.on("msg",(data)=>{
      io.local.emit("msg",data)      // 把消息发送给所有订阅了msg的用户
      //socket.emit("msg",data)          // 把消息发送给订阅了msg的自己
      //socket.broadcast.emit("msg",data)   // 把消息发给除自己外的其他订阅了msg的所有用户
})

// 利用房间发送私人消息
socket.on("privateChart",(room,data)=>{
       //socket.to("房间号").emit("msg",data)    // 把消息发送给已拥有房间中的指定房间内订阅了msg的除自己外的所有用户
      //socket.to("房间号1").to("房间号2").emit("msg",data)        // 也可以给多个房间发送
      socket.emit("privateChart",data)  
      socket.to(room).emit("privateChart",data);
})

// 用来切换房间
socket.on("changeRoom",(room)=>{
      //console.log(room)
      if(room=="room1") {
            socket.join("room1")        // 添加指定房间
            socket.leave("room2")        // 删除指定房间
      }
      else{
            socket.join("room2")
            socket.leave("room1")
      }
      //console.log(socket.rooms)      // 拥有的房间列表
})

socket.on("disconnect", (reason) => {
      // 此事件由 Socket 实例在断开连接时触发
});

})

server.listen(8866,()=>{
console.log('socketioServer is running in http://127.0.0.1:8866')
})

编写完后,比如该文件名为 socketIoServer.js,我们就是在终端使用指令node socketIoServer启动该服务即可,这样客户端那边就能连接该服务了。

前端代码如下,用到的api也不多,后端那边可能会多一点,具体使用看注释

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title></title>
		<style>
			#groupMsg,#privateMsg {
				width: 300px;
				height: 250px;
				border: 1px solid black;
				overflow: auto;
			}
			#groupInput,#privateInput {
				width: 150px;
				height: 40px;
			}
		</style>
	</head>
	<body>
		<h2>聊天社区</h2>
		<h3>群聊房间</h3>
		<div id="groupMsg"></div>
		<br />
		<input type="text" name="groupInput" id="groupInput" placeholder="按回车发送群消息" />
		<h3>私聊房间</h3>
		<div id="privateMsg"></div>
		<br />
		<span>请选择您的聊天房间(相同房间的人才可聊天):</span>
		<input type="radio" name="room" id="room1"  value="room1"  /> 房间1
		<input type="radio" name="room" id="room2"  value="room2" /> 房间2<br/><br/><br/>
		<input type="text" name="privateInput" id="privateInput" placeholder="按回车发送私人消息" />
		

		<script src="/socket.io.js">
			// 该文件在服务端安装的 socket.io 包 的 client-dist 目录下,复制过来引入
		</script>

		<script>
			//与服务器建立连接
			// const socket = io('http://localhost:8866/')
			const socket=io.connect("http://localhost:8866/")
			const groupInput = document.getElementById('groupInput')
			const groupMsg = document.getElementById('groupMsg')
			const privateInput = document.getElementById('privateInput')
			const privateMsg = document.getElementById('privateMsg')
			const room1 = document.getElementById('room1')
			const room2 = document.getElementById('room2')
			groupInput.onkeyup = (e) => {
				if (e.keyCode === 13) {
				   if(!groupInput.value) return
					 socket.emit('msg', groupInput.value)
					 groupInput.value = ''
				}
			}
			
			privateInput.onkeyup = (e) => {
				if (e.keyCode === 13) {   // 按回车发送消息
				 if(!room1.checked && !room2.checked) {alert("请选择私聊的房间");return}
				 if(!privateInput.value) return
					// 发送私人消息,第二个参数与后端约定传递房间号,之后的参数就都是数据了
					socket.emit('privateChart', room1.checked?"room1":"room2", privateInput.value)
					//groupMsg.innerHTML+=`<p>${ groupInput.value}</p>`
					privateInput.value = ''
				}
			}
      
			room1.onchange=(e)=>{    // 通知socket切换房间
				socket.emit("changeRoom","room1")
			}
			room2.onchange=(e)=>{  // 通知socket切换房间
				socket.emit("changeRoom","room2")
			}

			socket.on('msg', (data) => {
				// 订阅服务器发送到'msg'处的消息
				groupMsg.innerHTML += `<p>${data}</p>`
			})
     
			
			socket.on('privateChart', (data) => {
				privateMsg.innerHTML += `<p>${data}</p>`
			})

			socket.on('connect', () => {  // 连接成功后回调
			})

			socket.on('disconnect', (reason) => {   // 连接断开时回调
			})
      
		</script>
	</body>
</html>

此时,我们就可以在该html页面open with live server3次或者更多来开多个页签,这样就可以开始测试聊天了。然后要注意的是私人房间那里不要都选同一个房间。效果展示如下:

chat_socketIo文章来源地址https://www.toymoban.com/news/detail-676879.html

到了这里,关于带你掌握webSocket 和 socket.io的基本用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • socket.io 解决浏览器兼容性(WebSocket)

             在上一篇讲了 npm 上最流行的 WebSocket 库之一的 ws 库,那么本篇就来讲另外一个,就是 socket.io 库,socket.io 其实是一个兼容方案,当浏览器不支持 H5 的情况下就不能够使用上一篇内容讲的 WebSocket ,只能采用其他的方案,socket.io 就解决了关于浏览器的兼容。 Node实

    2023年04月21日
    浏览(58)
  • 【Vue3+Ts project】认识 Websocket 以及 socket.io 库

    目录 Websocket  socket.io  Socket.iO 事件名总结: Socket.IO 方法总结 作用: WebSocket 仍然提供实时的双向通信功能,使用Vue3 应用程序能够与服务器进行实时数据交换 降低延迟和网络开销:相比传统的HTTP请求-响应模式,WebSocket建立了持久连接,减少了网络开销和延迟,适用于需要

    2024年02月13日
    浏览(37)
  • 关于项目中websocket的socket.io客户端js库的应用

    sockt.io 在前端使用的js库需要知道哪些内容? 如何建立链接  io(\\\'地址\\\') 连接成功的事件  connect 如何发消息  emit  + 事件 如何收消息  on  + 事件 如果关闭连接  close() chatMsgList   接收 聊天记录 sendChatMsg  发送消息 receiveChatMsg   接收 消息 updateMsgStatus  消息已读 getChatMsgLis

    2024年02月19日
    浏览(36)
  • SpringBoot项目整合WebSocket+netty实现前后端双向通信(同时支持前端webSocket和socket协议哦)

    目录   前言 技术栈 功能展示 一、springboot项目添加netty依赖 二、netty服务端 三、netty客户端 四、测试 五、代码仓库地址   专属小彩蛋:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站(前言 - 床长人工智能教程

    2024年02月12日
    浏览(50)
  • 解决报错:Websocket connection to‘ws://127.0.0.1:5000/socket.io/?EIO=4&transport=websocket’failed:Error

    报错全文为:Websocket connection to‘ws://127.0.0.1:5000/socket.io/?EIO=4transport=websocket’failed:Error during Websocket handshake:Unexpected response code:400。如下图所示。 这个问题报的错误是EIO=4,查阅网上的各类信息资料会发现,基本没有这个报错的解法。网上基本大多数报错是EIO=3。 笔者认

    2024年02月14日
    浏览(42)
  • websocket实时通讯和socket.io实时通信库的使用;心跳机制与断线重连

    https://zh.javascript.info/websocket WebSocket 是一种网络通信协议,就类似于 HTTP 也是一种通信协议。 为什么需要 WebSocket? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。 代码解析: 创建WebSocket实例:通过 new WebSocket() 创建一个WebSocket实例。在括号中传入服务器的URL,该URL指定了

    2024年02月16日
    浏览(42)
  • 了解JS三种实时通信方式——Eventsource、websocket与socket.io之间的差异和优缺点

    EventSource EventSource 是一种轻量级的 API,用于获取来自服务器的实时事件。它是 WebSockets 的替代方案,因为它比 WebSockets 更简单,更适合处理服务器向客户端发送数据的情况。使用 EventSource ,只有服务器能够发送消息,所以它更安全。但是,它不支持双向通信或客户端发送消

    2024年02月08日
    浏览(49)
  • 远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据

    1. 什么是socket? 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 2. 什么是websocket? WebSocket是一种网络通信协议,是HTML5新增的特性,

    2024年02月15日
    浏览(58)
  • WebSocket 和 Socket 的区别

    WebSocket 和 Socket 的区别就像Java和JavaScript,并没有什么太大的关系,但又不能说完全没关系。可以这么说: 1.命名方面,Socket是一个深入人心的概念,WebSocket借用了这一概念; 2.使用方面,完全两个东西。 当我们探讨两件事物的区别和联系时,我们想探讨些什么? 对这个问题

    2023年04月08日
    浏览(37)
  • .NET 基于Socket中转WebSocket

    针对IOS App Proxy Server无法直连WebSocket,建立 Socket中转端。 WebSocket 端 : WebSocket 端用于实现实时通信功能。 WebSocket 端通过 WebSocket 协议与中转端通信,中转端可以通过 WebSocket 或其他传输协议与 WebSocket 端建立连接,收发消息。 定义 SendMessageToChatRoomIP 和 JoinChatRoom,用于处理

    2024年04月27日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包