node.js 权威指南1——tcp客户端与tcp服务器端的创建

Buffer对象:存放二进制数据的缓存区

创建:var buf = new Buffer()
初始化:buf.fill(value, [offset], [end])
Buffer对象转化为字符串格式:buf.toString(‘utf8’)
向已创建的Buffer对象写入字符串:buf.write(string, [offset], [length], [encoding])
Buffer对象与JSON对象的转换:
JSON.stringify(buf): Buffer =>字符串
JSON.parse(…): 将已经转换后的字符串还原为数组
concat():将几个Buffer结合为一个新的Buffer
Buffer.concat([buf1,buf2,…])
Buffer,isBuffer( obj ) :判断obj是不是Buffer对象

文件读写

var fs = require(‘fs’)
读取文件:fs.readFile(filename路径, ‘utf8’, function(err, data){ …} )
写入文件:fs.writeFile(filename路径, data, [options], function(err){…})
向文件尾部追加数据:fs.appendFile(filename路径, data, [options], callback)
创建目录:fs.mkdir(path, callback)
删除空目录:fs.rmdir(path, callback(err))
读取目录:fs.readdir(path, function(err ,data){…})
查看文件、目录信息:fs.stat(path, function(err, stats){
stats,isFile:是否是文件;
stats.isDirectory:是否为目录;
检查文件、目录是否存在:fs.exists(path,function(exists){…})
获得绝对路径:fs.realpath(path,function(err,realpath){…} )
移动文件、目录:fs.rename(oldpath, newpath, callback)
若原路径和新路径安全一样,仅仅是名字不同,则执行改名功能

硬链接:一个文件创建后就有了一个文件名,这个文件的硬链接数为1,当他再被指定为一个新的文件名时,就是为其创建了硬链接。

创建硬链接:fs.link(srcpath,dstpath, function(err){…}0
删除硬链接:fs.unlink(path,callback(err))

符号链接:是一种特殊的文件,该文件中仅包含另一个文件的路径及名字,当打开一个文件的符号链接进行编辑时,操作系统会自动打开源文件进行编辑,若删除符号链接文件,不会删除源文件,反之亦然只是会发生断链现象。

fs.symlink(srcpath, dstpath, [type] callback(err))
type: file: 文件
dir:目录
文件改变时的处理:fs.watch(path).on(‘change’, function(event, filename){
event:当文件被重命名,移动,删除时为‘rename’,
当文件中内容发生改变为:‘change’
}

一种有序的,有起点和终点的字节数据的传输手段
应用程序中各种对象之间交换和传输数据时,先将该对象中所包含的数据转换成为各种该流数据(即字节数据),再通过流的传输,到达目的对象后在将流数据转为可悲该对象使用的数据。
创建将文件内容读取为流数据的ReadStream对象:
fs.createReadStream(path, [options])
options: start: 指定文件开始读取的位置
end:结束的位置
encoding:编码格式
var file - fs.createReadStream(’./text.txt’)
开始读取文件:file.on(’ open’ ,callback(fd))
读取的数据: file.on(‘data’, callback(data))
结束读取:file.on(‘end’, callback)
读取失败:file.on(‘error’, callback(err))
文件被关闭:file.on(close’, callback))
暂停/ 恢复读取:file.pause()/ file.resume()
文件复制:file.pipe(writable)
创建将流数据写入文件的WriteStream对象:fs.createWriteStream(path, [options})
var writable = fs.createWreteStreamd(’./next.txt’)
将数据写入:writable.write(‘data’
写入结束:writable.end()

对路径进行操作

var path - require('path')
返回字符串结合后的路径字符串:path.join(path1, path2, path3...)
返回一个绝对路径(以应用程序根目录为起点):path.resolve(path1, path2...)
path.relateix(from, to): 以from为参考 找到头
				返回以第一个路径为当前路径,并使用相对路径指定第二个路径是应使用的表达式	
返回文件或目录上一级的路径名、目录名:path.dirname(文件/目录)
返回文件的文件名:path.basename(文件路径)
返回一个文件的扩展名:path.extname(文件路径)

三次握手协议

在发送数据的准备阶段,服务器与客户端之间进行三次交互
一握:客户端发送syn(syn=j)到服务器,并进入SYN_SEND状态
二握:服务器收到syn包,确认客户端的syn(A出口= j+1),同时发送一个syn包(syn=k)即SYN+ACK包给客户端,进入SYN-RECV状态
三握:客户端收到SYN+ACK包,向服务器发送确认包ACK(ACK = k+1),之后,客户端和服务器建立联系,进入EXTABLISHED状态

TCP: 传输控制协议。一种面向连接的可靠的,基于字节流的传输层通讯协议。在IP层之上,在应用层之下

应用层向TCP层发送用于王建传输的,用8位字节表示的数据流,之后TCP吧数据分成长度合适的报文段,之后吧结果传给IP层,由IP层通过网络将包传给接受实体的TCP层。
TCP 为了不丢包,会给每个包一个序号,也保证了接受实体能按顺序接受包。之后接受实体对已经接收到的包发挥一个相应的确认ACK,若发送端在合理时间内,未收到ACK,则认为对应的包丢失,并重传。

创建TCP服务器

var net = require('net')
var server = net.createServer(function(socket){...}) // 创建服务器
server.listen(port , host, function(){...}) // 最后才服务器开始监听

查看该服务器所监听的地址信息:address = server.address()
查看/设置与TCP服务器建立连接的客户端数量:
server.getConnections(function(err, count){
server.maxConnections = num; //设置最大链接数量
})
关闭服务器:server.on(‘close’,callback)
创建socket端口对象: 可用来读取对方端口发送来的数据流。

var net = require('net')
var server = net.createServer()
var file = require('fs').createWitableStream('./存档数据.txt’)
socket.setEncoding('utf8') // data是Buffer对象,所以要转码格式为字符串
server.on('connection', function(socket){
	socket.on('data', function(data){
		//处理数据
	}
	socket.setTimeout(10 000)  // 设置客户端超时时间
	socket.pause() // 将每个客户端发送的数据暂放在一个单独的缓冲区内
	socket.on('timeout', function( // 监听超时事件
		socket.resume();
		socket.pipe(file)// 将数据写到文件中
	})
	socket.on('data',function(data){
		socket.resume() // 将数据再次放在缓存区内,当客户端再次超时时,才真正将数据写入文档
	})
})
server.listen(port, host)

创建TCP客户端

var client = new net.Socket()
链接TCP服务端: client.connect(port, [host], callback)
向客户端或者服务端发送数据的方式:client.write(data, callback)
client.setEncoding(‘utf8’)
监察error:client.on(‘error’, function(err){
client.destroy() // 销毁此socket对象
})
关闭与服务器的链接:client.on(‘end’, callback)
当客户端全部关闭后,默认状态下,服务端不会自动关闭,手动设置:
(在服务端设置) socket.on(‘end’,function(){
server.unref()
})
当客户端或者服务端断电,重启等意外发生时,来不及向另一方发送关闭连接的FIN包,此时另一方永远处于连接状态
解决方法: socket.setKeepAlive( true, [time])
定时向另一方发送探测包,若对方没有响应,则默认对方已经关闭连接。

net 的其他类方法

net.isIP(string): 判断是不是ip地址 返回0(不是)、IPv4,IPv6
net.isIPv4()
net.isIPv6()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值