• nodejs复习04


    TCP/UDP网络应用

    创建TCP服务器客户端

    • socket套接字对象实例,是对TCP协议的一个基本封装接口
    • clientt套接字对象实例
    //server.js
    var net = require('net');
    var HOST = '127.0.0.1';
    var PORT = 9694;
    
    var server = net.createServer(function (socket) { 
    
        console.log('Server listening on ' + HOST + ':' + PORT);
        console.log('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort);
    
        socket.on('data', function (data) {
          console.log('DATA ' + socket.remoteAddress + ':"' + data + '"');
          socket.write('Server write: this is server')
        })
    
        socket.on('close', function (data) {
          console.log('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort);
        })
    })
    
    server.listen(PORT, HOST)
    
    
    //client.js
    var net = require('net');
    var HOST = '127.0.0.1';
    var PORT = 9694;
    
    var client = net.connect(PORT, HOST, function () {
    	console.log('client connected');
    	client.write('client write: this is client');
    })
    
    client.on('data', function (data) {
    	console.log(data.toString());
    	client.end();
    })
    
    client.on('end', function () {
    	console.log('client disconnected');
    })
    
    
    • 关闭端口的方法
    List open files on a port and copy PID
    
    lsof -i :<port>
    Kill it with fire :)
    
    kill -9 <PID>
    

    另一种方法创建服务器

    var net = require('net');
    var HOST = '127.0.0.1';
    var PORT = 9694;
    
    var server = net.createServer()
    
    server.listen(PORT, HOST)
    
    server.on('listening', function () {
            var addr = server.address()   //获取服务器地址,必须在listening事件之后
    	console.log('Server listening on ' + addr.address + ':' + addr.port);
    })
    
    server.on('connection', function (socket) {
    	console.log('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort);
    
    	socket.on('data', function (data) {
    		console.log(data.toString());
    		socket.write('server write: this is server')
    	})
    
    	socket.on('close', function () {
    		console.log('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort);
    		server.close();
    	})
    })
    
    server.on('error', function (err) {
    	console.log('Error occurred: ' + err.message);
    })
    
    server.on('close', function () {
    	console.log('server is closed');
    })
    

    获得当前服务器连接数

    server.getConnections(function (err, count) {
        	console.log(count);
    })
    

    套接字地址

    //套接字绑定的IP地址,端口
    socket.localAddress
    socket.localPort
    socket.address() //与server.address()相同
    
    //远程地址
    socket.remoteAddress
    socket.remotePort
    
    //套接字接受和发送数据的字节长度
    socket.on('data', function (data) {
    	console.log(socket.bytesRead);  //
    	console.log(data.toString());
    	socket.write('server write: this is server')
    	console.log(socket.bytesWritten);  //
    })
    

    控制套接字数据流

    var bSockData = true
    
    server.on('connection', function (socket) {
    
    	if(bSockData) {
    		sock.resume();  //暂停data事件
    		bSockData = false
    	} else {
    		socket.pause();  //继续data事件
    		bSockData = true
    	}
    
    	socket.on('data', function (data) {})
    
    	socket.on('close', function () {})
    })
    

    创建UDP服务器客户端

    • 创建socket使用参数udp4/udp6,分别对应Ipv4/Ipv6,前者使用更多
    • UDP数据报发送给服务器后,服务器一般不能回写,因为该协议就是为例快速发送数据包
    //server.js
    var dgram = require('dgram')
    var HOST = '127.0.0.1'
    var PORT = 12345;
    
    //创建一个udp4类型的数据报套接字
    
    var server = dgram.createSocket('udp4')
    
    server.on('listening', function () {
    	var address = server.address();
    	console.log('UDP Server listening on ' + address.address + ":" + address.port);
    })
    
    server.on('message', function (message, remote) {
    	console.log('UDP Server received from ' + remote.address + ':' + remote.port);
    	console.log('-' + message);
    	server.close()
    })
    
    server.on('error', function (err) {
    	console.log('server error: ' + err.stack);
    	server.close()
    })
    
    	server.on('close', function () {
    	console.log('server closed');
    })
    
    //绑定主机和端口
    server.bind(PORT, HOST)
    
    
    //client.js
    var dgram = require('dgram')
    var HOST = '127.0.0.1'
    var PORT = 12345;
    
    var message = new Buffer('UDO Client to server');
    
    var client = dgram.createSocket('udp4')
    
    client.send(message, 0, message.length, PORT, HOST, 
    	function (err, bytes) {
    		if(err) throw err;
    		console.log('client send to: ' + HOST + ":" + PORT);
    		console.log('-' + bytes);
    		client.close();
    })
    
    
    client.on('close', function () {
    	console.log('client closed');
    })
    
    

    UDP广播服务

    • UDP广播和单播的不同就是通信IP地址不同,广播使用255.255.255.255发送到同一广播上的每个主机
    • 广播不会被路由器转发
    //server.js
    .....
    //由于接受客户端广播数据报,仅仅绑定端口号
    server.bind(PORT)
    
    
    //client.js
    var HOST = '255.255.255.255'
    .....
    client.bind(function () {
    	client.setBroadcast(true)   //广播
    })
    

    简单的聊天应用

    var net = require('net')
    var HOST = '127.0.0.1'
    var PORT = 6688
    
    var clientList = []
    
    var server = net.createServer();
    
    server.on('connection', function(client) {
    	clientList.push(client);
    	client.name = client.remoteAddress + ":" + client.remotePort
    	broadcast('him ' + client.name + ' join in!
    ', client)
    	client.write('hi, ' + client.name + '!
    ')
    
    	client.on('data', function (data) {
    		broadcast(client.name + ' say:' + data + '
    ', client)
    	})
    
    	client.on('end', function () {
    		broadcast('hi,' + client.name + ' quit!
    ', client)
    		clientList.splice(clientList.indexOf(client), 1)
    	})
    })
    
    function broadcast(message, client) {
    	var cleanup = [];
    	for (var i = 0, len = clientList.length; i < len; i++) {
    		var o_client = clientList[i]
    		if(client !== o_client) {
    			if(o_client.writable) {
    				o_client.write(message)
    			} else {
    				cleanup.push(o_client)
    				o_client.destroy()
    			}
    		}
    	}
    	for (var i = 0; i < cleanup.length; i++) {
    		clientList.splice(clientList.indexOf(cleanup[i]), 1)
    	}
    }
    
    server.listen(PORT, HOST)
    
    
    • 测试telnet 127.0.0.1 6688
  • 相关阅读:
    [Err] 1064
    maven项目警告: Using platform encoding (UTF-8 actually) to copy filtered resources
    maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
    springMVC 中url后缀使用html,不能返回json数据,否则会报406错误
    网站并发量的计算方法
    win7旗舰版显示不了文件扩展名
    Java获取mysql数据库元数据
    spring中 context:property-placeholder 导入多个独立的 .properties配置文件
    Could not autowire field: private java.lang.Integer com.taotao.sso.service.impl.UserServiceImpl.SSO_
    linux Nginx服务开机自启
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/6082548.html
Copyright © 2020-2023  润新知