高性能并发网络服务器设计与实现-(1)

上传人:cl****1 文档编号:569740945 上传时间:2024-07-30 格式:PPT 页数:24 大小:593.01KB
返回 下载 相关 举报
高性能并发网络服务器设计与实现-(1)_第1页
第1页 / 共24页
高性能并发网络服务器设计与实现-(1)_第2页
第2页 / 共24页
高性能并发网络服务器设计与实现-(1)_第3页
第3页 / 共24页
高性能并发网络服务器设计与实现-(1)_第4页
第4页 / 共24页
高性能并发网络服务器设计与实现-(1)_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《高性能并发网络服务器设计与实现-(1)》由会员分享,可在线阅读,更多相关《高性能并发网络服务器设计与实现-(1)(24页珍藏版)》请在金锄头文库上搜索。

1、高性能并发网络服务器设计与实现http:/ 交互时序等)n只要涉及到交互(即使不是网络交互), 就需要协议p网络实现(IO)n网络开发的基础是socketn任何对网络的封装, 在三度关系之内必然是socket(最多三层封装)第一节 网络IOTalk is cheap, show me the codeserv = new TcpSocket();serv.listen();sock = serv.accept();sock.read(buf);sock.write(buf);sock.close()p 一次服务p 没有并发p 短连接p 有没有协议?p最简单的TCP服务器重复服务serv = n

2、ew TcpSocket();serv.listen();while(1) sock = serv.accept();while(1)/重复服务单用户 sock.read(buf); sock.write(buf); sock.close()p 一次服务p 没有并发p 短连接socket IOpread/write是可阻塞的p阻塞是并发和高性能的死敌p实现并发和高性能的途径就是解阻塞p太简单了!p后面继续讲解read/write.并发服务serv = new TcpSocket();serv.listen();while(1) sock = serv.accept(); new Thread(

3、) while(1)/重复服务单用户 sock.read(buf); sock.write(buf); sock.close() p 一次服务p 没有并发p 短连接优缺点p优点:n简单易用, 一般工作得很好n多线程, 可以利用CPU多核p缺点:n启动线程也有成本, 很可能占大头n线程的数量不受控制, 危险!p问题在于IO.IO多路复用p专业地解决一个问题pselect/poll/epoll/kqueue的API几乎一样, 实现不同, 性能不同pIO多路复用接口的作用, 就是测试accept/read/write等IO调用会不会阻塞IO多路复用示例serv = new TcpSocket();

4、serv.listen();select.add(serv, READ); / READ 表示只测试可读(读不阻塞)while(1) readable, writable = select.wait(); foreach(readable as sock) if(sock = serv) sock = serv.accept(); select.add(sock, READ); else sock.read(buf); sock.write(buf); sock.close(); / writable 为空, 因为我们不测试可写还不完善pwrite也可能阻塞, 修改.sock.read(buf

5、);sock.write(buf); sock.close();select.add(sock, WRITE);foreach(writable as sock) sock.write(buf); sock.close();第二节 报文解析报文设计p最重要的TCP协议是流式协议, 但几乎所有的应用协议都是基于报文的协议n报文分隔p用连接关闭来表示报文结束. 如, HTTP/1.0的响应p固定长度的报文. 如, TFTP的数据报文.p带自描述长度的固定长度首部的变长报文. 如IP包, TCP分段.p带结束符. 如, 行协议, HTTP协议. 逐字节解析和数据转义的影响.高层文本, 带结束符底层二

6、进制, 固定长度SSDB的报文格式Packet := Block+ nBlock := Size DataSize := literal_integer nData := size_bytes_of_data n示例:3get3key优点p简单p带长度字段, 支持二进制数据p同时对人和对机器友好, 报文数据文本化效果好. 可以telnet到服务器进行交互p解析器非常简单, PHP代码不过几十行p同时兼容LF和CRLF(惯例)socket io 2pread/write读取/发送的是字节数组. C语言的char, PHP的stringpread返回时读取的准确字节数无法预计n导致粘包, 断包pw

7、rite返回时不表示数据已到达对方机器n所以, 即便基于可靠传输的TCP协议, 也需要应用层协议进行确认来保证真正意义上的可靠带有报文解析的服务器serv = new TcpSocket();serv.listen();sock = serv.accept();client = new Client(sock);client.recv(packet);client.send(packet);client.close()ppacket一般是编程语言中的对象序列化和反序列化pread收到的是字节数组, 要进行反序列化转成编程语言的对象p反序列化的过程就是报文解析解析报文bytes = ;while

8、(1) bytes += sock.read(); if(try_parse(bytes, &len) = READY) / 已经解析出了一个报文, 报文的长度是len / 从字节数组中清除掉已解析的 bytes.remove(len); 整合网络IO和报文解析p将上例中的read和try_parse分离p作业.第三节 业务处理p网络服务器 = 协议处理 + 网络IO + 业务处理业务处理的位置serv = new TcpSocket();serv.listen();sock = serv.accept();client = new Client(sock);request = client.recv();response = process(request);client.send(response);client.close()对于SSDB, LevelDB 相关的操作封装在 process 中.剩下的.p就是看代码写代码.FINThanksSSDB: https:/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号