参考:http://nodejs.cn/api/net.html
w3school的socket.io:https://www.w3cschool.cn/socket/
文本socket:https://www.w3cschool.cn/websocket_protocol/qn6p1ozt.html
在NodeJS中有三种socket:1. TCP,2. UDP,3. Unix域套接字
net
模块提供了创建基于流的 TCP 或 IPC 服务器(net.createServer()
)和客户端(net.createConnection()
) 的异步网络 API
====================net模块实现socket==============
***********app.js**********
var express = require('express');
var app = express();//创建express实例
var routes=require('./routes/routes.js');//吧路由引入; ./ 代表项目的当前总目录 /Users/wofu/Desktop/node
//***************
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 8081;
// 创建一个TCP服务器实例,调用listen函数开始监听指定端口
// 传入net.createServer()的回调函数将作为”connection“事件的处理函数
// 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的
net.createServer(function(sock) {
// 我们获得一个连接 - 该连接自动关联一个socket对象
// 为这个socket实例添加一个"data"事件处理函数
sock.on('data', function(data) {
console.log('从客户端接受的数据: ' +
data);
// 回发该数据,客户端将收到来自服务端的数据
sock.write(' 向客户端回发数据 "' + data+ "\n");
sock.end("关闭socket");//奖触发客户端和服务端的close事件监听
});
//数据错误事件
sock.on('error',function(exception){
console.log('服务端错误socket error:' + exception);
sock.end();
});
// 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function(data) {
console.log('服务端CLOSED: ');
});
}).listen(PORT, HOST);
console.log('Server listening on ' + HOST +':'+ PORT);
//**************
routes.router(app);//调用路由
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log(__dirname);//这里的目录就是/Users/wofu/Desktop/node,其中node文件夹我是直接放在了桌面
console.log(host);//主机地址
console.log(port);//端口号
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
*************routes.js******************
var router = function(app){
app.get('/one', function (req, res) {
res.write("ddd");
res.end();
});
var net = require('net');
var port = 8081;
var host = '127.0.0.1';
var client = new net.Socket();
//客户端连接
client.connect(port, host, function() {
//客户端向服务端socket发送数据
client.write('向服务器发送数据I am Chuck Norris!');
});
// 为客户端添加“data”事件处理函数
// data是服务器发回的数据
client.on('data', function(data) {
console.log("从服务器接受的数据"+data+" \n");
});
// 为客户端添加“close”事件处理函数
client.on('close', function() {
console.log('客户端Connect closed');
});
};
exports.router = router;
============socket.io实现socket通信=======
载入模块:npm install socket.io
https://socket.io/get-started/chat/
github地址:https://github.com/socketio/socket.io/blob/master/docs/API.md
http://javacheng.oschina.io/socket.io/
主要应用到的函数有5个:
.on('connection', function(socket){ }):与客户端建立连接时监听。
.on('disconnect', function(){ }):与客户端断开连接时监听。
.on('event-name', function(data) { }):监听客户端发来的消息。
.broadcast.emit('event-name', { }):向除自己外的所有其他用户广播消息。
.emit('event-name', { }):仅向当前连接的客户端(自己)推送消息。
// 服务端// socket.emit(‘String’, data);//给该socket的客户端发送消息
*************app.js*************创建服务端的socket
var express = require('express');
var app = express();//创建express实例
var routes=require('./routes/routes.js');//吧路由引入; ./ 代表项目的当前总目录 /Users/wofu/Desktop/node
var http = require('http');
var server=http.createServer(app);
var io = require('socket.io').listen(server);//require(‘socket.io’).listen(server) 实际上这句就是讲socket的监听加入的app设置的http模块了
server.listen(8081);
io.sockets.on('connection', function (socket) {//io.sockets.on(‘connection’,function()…)监听连接后进行的处理,
// 代码示例中,主要包含两件事,一个是向前端发送news的事件,一个是监听m事件。
console.log("建立了连接");
socket.emit('news', { hello: '服务端world' });//触发一个news事件
socket.on('m', function (data) {//监听m事件
console.log(data);
});
});
routes.router(app,io);//调用路由
************routes.js***********路由
var router = function(app,io){
app.get('/one', function (req, res) {
res.sendFile("/Users/wofu/Desktop/node/views/one.html");
// res.write("ddd");
});
};
exports.router = router;
**********one.html**********客户端连接socket
This is our socket.html file