NodeJS实现TCPSocket(套接字)服务器和客户端

TCP Socket(套接字)客户端

①通过调用net.connect()创建套接字客户端
②在回调函数里建立连接行为,你可以添加超时时间或编码
③需要添加处理程序来处理data,end、error、timeout、close事件
④把数据写到服务器,如果写入失败就可能需要实现drain事件处理程序

清单

这个客户端只是发送一点数据到服务器并接收回一点数据,注意,有3个单独的套接字打开到服务器,而它们同一时间进行通信。

/**
 * @description TODO
 * @author suiyue
 * @date 2019/9/4 21:35
 */
var net = require('net');
function getConnection(connName) {
    var client = net.connect({port:8107,host:'localhost'},function () {
        console.log(connName + 'Connected:');
        console.log(' local= %s:%s',this.localAddress,this.localPort);
        console.log(' remote= %s:%s',this._remoteAddress,this._remoteAddress);
        this.setTimeout(500);
        this.setEncoding('utf8');
        this.on('data', function (data) {
            console.log(connName+" From Server:"+data.toString());
            this.end();
        });
        this.on('end', function () {
            console.log(connName + 'Client disconnection');
        });
        this.on('error',function (err) {
            console.log('Socket Error:' + JSON.stringify(err));
        });
        this.on('timeout',function () {
            console.log('Socket Timed Out');
        });
        this.on('close', function () {
            console.log('Socket Closed');
        });
    });
    return client;
}
function writeData(socket, data) {
    var success = !socket.write(data);
    if(!success) {
        (function (socket, data) {
            socket.once('drain', function () {
                writeData(socket, data);
            });
        })(socket, data);
    }
}
var Dwarves = getConnection("Dwarves");
var Elves = getConnection("Elves");
var Hobbits = getConnection("Hobbits");
writeData(Dwarves, "More Axes");
writeData(Elves, "More Arrows");
writeData(Hobbits, "More Pipe Weed");

TCP Socket(套接字)服务器

①通过调用net.createServer()创建socket服务器,还需要提供一个连接回调处理程序,然后调用listen()在端口8107监听
②在listen回调处理程序内添加处理程序支持server对象上的close和error事件
③在connection事件回调函数里面建立连接的行为
④添加处理程序处理客户端连接上的data、end、error、timeout和close事件
⑤把数据写入服务器

清单

服务器在端口8107上接受连接,读取数据,把数据放回给客户端

/**
 * @description TODO
 * @author suiyue
 * @date 2019/9/4 21:52
 */
var net = require('net');
var server = net.createServer(function (client) {
    console.log(' Client connection:');
    console.log(' local= %s:%s',client.localAddress,client.localPort);
    console.log(' remote= %s:%s',client._remoteAddress,client._remoteAddress);
    client.setTimeout(500);
    client.setEncoding('utf8');
    client.on('data', function (data) {
        console.log('Received data from client on port %d: %s', client.remotePort, data.toString());
        console.log('Bytes received:', client.bytesRead);
        writeData(client,'Sending:'+data.toString());
        console.log(' Bytes sent:' + client.bytesWritten);
    });
    client.on('end', function () {
        console.log('Client disconnected');
        server.getConnections(function (err, count) {
            console.log('Remaining Connection:' + count);
        });
    });
    client.on('error', function (err) {
        console.log('Socket Error:', JSON.stringify(err));
    });
    client.on('timeout', function () {
        console.log('Socket Timed Out');
    });
});
server.listen(8107, function () {
    console.log('Server listening: ' + JSON.stringify(server.address()));
    server.on('close', function () {
        console.log('Server Terminated');
    });
    server.on('error', function (err) {
        console.log('Server Error:', JSON.stringify(err));
    });
});
function writeData(socket,data) {
    var success = !socket.write(data);
    if (!success) {
        (function(socket, data){
            socket.once('drain', function () {
                writeData(socket, data);
            });
        })(socket,data);
    }
}

结果

服务器


在这里插入图片描述
②客户端连上在这里插入图片描述

客户端

在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值