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!\r\n', client)
	client.write('hi, ' + client.name + '!\r\n')

	client.on('data', function (data) {
		broadcast(client.name + ' say:' + data + '\r\n', client)
	})

	client.on('end', function () {
		broadcast('hi,' + client.name + ' quit!\r\n', 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
posted @ 2016-11-20 13:56  JinksPeng  阅读(310)  评论(0编辑  收藏  举报