Node.js环境实现socket通信过程解析
什么是Socket通信
Socket(套接字)是一种IPC(进程间通信)的方式,通常也称作"套接字"。通俗理解,套接字就像两人之间的一条电话线,通过这条线实现一对一或者一对多的实时通信。
在计算机网络中,Socket又称为“网络套接字”,是一种基于TCP/IP协议的网络通信方式。与传统的HTTP协议不同,它是一种面向连接的协议,即每次通信之前需要先建立一条双向连接。
实现Socket通信的方法
在JavaScript中,可以通过各种库和框架来实现Socket通信。其中,Node.js是一种非常常用的开发环境,通过其内置的socket库,可以方便地实现Socket通信。
下面是Node.js环境实现Socket通信的步骤:
- 创建Socket服务器端
const net = require('net');
const server = net.createServer((socket) => {
console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 已连接`);
socket.write('欢迎进入聊天室!');
socket.on('data', (data) => {
console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 发来消息: ${data}`);
// 将消息广播给其他所有客户端
server.getConnections((err, clients) => {
if (err) { throw err; }
clients.forEach((c) => {
if (c !== socket && c.writable) {
c.write(`${socket.remoteAddress}:${socket.remotePort}:${data}`);
}
});
});
});
}).listen(8888, () => {
console.log('Socket服务器已启动');
});
以上是一个简单的Socket服务器端,可以监听8888端口,等待客户端连接。当客户端连接后,会发送一条欢迎消息,并且可以监听到客户端发送的消息,并在控制台输出。
- 创建Socket客户端
const net = require('net');
const client = new net.Socket();
const host = '127.0.0.1';
const port = 8888;
client.connect(port, host, () => {
console.log(`已连接至服务器 ${host}:${port}`);
client.write('Hello World!');
});
client.on('data', (data) => {
console.log(`收到来自服务器的消息:${data}`);
});
client.on('close', () => {
console.log('连接已关闭');
});
以上是一个简单的Socket客户端,可以连接到服务器,并发送一条消息。同时也监听到服务器返回的消息,并在控制台输出。
Socket通信的应用场景
对于Socket通信,最常见的应用场景就是实现实时通讯,例如聊天室、直播间等应用。当然,在广泛的网络应用中,Socket通信也有着其他应用,例如视频流传输、游戏对战等。
示例1:应用场景——聊天室
创建一个简单的聊天室,使用Node.js的Socket库实现实时聊天。
- 创建服务器端
const net = require('net');
const server = net.createServer((socket) => {
console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 已连接`);
socket.write('欢迎进入聊天室!');
socket.on('data', (data) => {
console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 发来消息: ${data}`);
// 将消息广播给其他所有客户端
server.getConnections((err, clients) => {
if (err) { throw err; }
clients.forEach((c) => {
if (c !== socket && c.writable) {
c.write(`${socket.remoteAddress}:${socket.remotePort}:${data}`);
}
});
});
});
}).listen(8888, () => {
console.log('Socket服务器已启动');
});
以上是一个简单的Socket服务器端,可以监听8888端口,等待客户端连接。当客户端连接后,会发送一条欢迎消息,并且可以监听到客户端发送的消息,并将消息广播给其他所有客户端。
- 创建客户端
const net = require('net');
const client = new net.Socket();
const host = '127.0.0.1';
const port = 8888;
client.connect(port, host, () => {
console.log(`已连接至服务器 ${host}:${port}`);
});
client.on('data', (data) => {
console.log(`${data}`);
});
process.stdin.on('data', (data) => {
client.write(data);
});
以上是一个简单的Socket客户端,可以连接到服务器,并接收广播的消息。同时也可以在控制台输入消息,并发送给服务器。
- 运行程序
在控制台中,开两个窗口,分别运行服务器端和客户端。当客户端连接上服务器后,就可以实时聊天了。
示例2:应用场景——在线画图
创建一个简单的在线画图应用,使用Node.js的Socket库实现实时绘图。
- 创建服务器端
const net = require('net');
const server = net.createServer((socket) => {
console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 已连接`);
socket.write('欢迎进入在线画图应用!');
socket.on('data', (data) => {
console.log(`客户端 ${socket.remoteAddress}:${socket.remotePort} 发来消息`);
// 将消息广播给其他所有客户端
server.getConnections((err, clients) => {
if (err) { throw err; }
clients.forEach((c) => {
if (c !== socket && c.writable) {
c.write(data);
}
});
});
});
}).listen(8888, () => {
console.log('Socket服务器已启动');
});
以上是一个简单的Socket服务器端,可以监听8888端口,等待客户端连接。当客户端连接后,会发送一条欢迎消息,并且可以监听到客户端发送的消息,并将消息广播给其他所有客户端。
- 创建客户端
<!--index.html-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>在线画图</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
canvas {
background: white;
border: 1px solid black;
cursor: crosshair;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
const canvas = document.querySelector('#canvas');
const ctx = canvas.getContext('2d');
const socket = new WebSocket('ws://localhost:8888');
canvas.addEventListener('mousedown', onmousedown);
canvas.addEventListener('mousemove', onmousemove);
canvas.addEventListener('mouseup', onmouseup);
function onmousedown(e) {
ctx.beginPath();
ctx.moveTo(e.offsetX, e.offsetY);
canvas.addEventListener('mousemove', onmousemove);
}
function onmousemove(e) {
ctx.lineTo(e.offsetX, e.offsetY);
ctx.stroke();
const data = JSON.stringify({
type: 'moveTo',
x: e.offsetX,
y: e.offsetY,
});
socket.send(data);
}
function onmouseup(e) {
ctx.closePath();
canvas.removeEventListener('mousemove', onmousemove);
}
socket.addEventListener('open', (event) => {
console.log('已连接到服务器');
});
socket.addEventListener('message', (event) => {
const data = JSON.parse(event.data);
if (data.type === 'moveTo') {
ctx.beginPath();
ctx.moveTo(data.x, data.y);
} else if (data.type === 'lineTo') {
ctx.lineTo(data.x, data.y);
ctx.stroke();
}
});
</script>
</body>
</html>
以上是一个简单的Socket客户端,使用WebSocket连接到服务器,并通过HTML Canvas实现在线绘图。当鼠标在画布上移动时,客户端将发送对应的坐标给服务器,服务器将接收到的坐标再广播给其他客户端。
- 运行程序
在控制台中,运行服务器端。在浏览器中,打开index.html文件,并使用多个标签页测试在线绘图效果。可以看到,当一个客户端在画布上移动时,其他客户端也会实时看到该画布上的移动操作。
结论
以上两个示例展示了使用Node.js环境实现Socket通信的基本步骤和应用场景。通过Socket通信,我们可以实现实时聊天、在线协作等各种应用,为我们的网络应用增加了更多的可能性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs环境实现socket通信过程解析 - Python技术站