POCO库中文编程参考指南(10)如何使用TCPServer框架?

POCO库中文编程参考指南(10)如何使用TCPServer框架?,第1张

Author: 柳大·Poechant(钟超)Email: zhongchao.ustc@gmail.comBlog: Blog.CSDN.net/PoechantDate: April 21th, 20121 TCPServer 框架概述POCO 库提供TCPServer框架,用以搭建自定义的 TCP 服务器。TCPServer维护一个连接队列、一个连接线程池。连接线程用于处理连接,连接线程只要一空闲就不断地从连接队列中取连接并进行处理。一旦连接线程从连接队列中取到一个连接,就会创建一个TCPServerConnection连接对象,并且调用该对象的start()方法,直到start()方法返回,这个连接对象就被删除了。连接线程的数量是动态的,其取决于连接队列中排队的连接数。当然,你使用的时候可以设定连接队列的最大容量,以防止在高并发应用的服务器上出现连接太多而使连接队列溢出的悲剧发生。当连接队列满了,却还有新的连接到来时,新来的连接就会被立即悄无声息地关闭。// PoechantTCPConnection.h #ifndef POECHANT_TCP_CONNECTION_H #define POECHANT_TCP_CONNECTION_H #include "Poco/Net/TCPServerConnection.h" #include "Poco/Net/StreamSocket.h" #include <string>class PoechantTCPConnection: public TCPServerConnection { public: PoechantTCPConnection(const StreamSocket&s, const std::string&arg1, int arg2, double arg3)void run()private: std::string _arg1int _arg2double _arg3}#endif 实现如下:// PoechantTCPConnection.cpp #include "PoechantTCPConnection.h" #include "Poco/Util/Application" #include "Poco/Timestamp.h" #include "Poco/Exception.h" #include "Poco/DateTimeFormatter.h" PoechantTCPConnection(const StreamSocket&s, const std::string&arg1, int arg2, double arg3): TCPServerConnection(s), _arg1(arg1), _arg2(arg2), _arg3(arg3) { } void run() { Application&app = Application::instance()// 日志输出连接的TCP用户的地址(IP和端口) app.logger().information("Request from " + this->socket().peerAddress().toString())try { // 向客户端发送数据,这里以发送一个表示时间的字符串为例 Timestamp nowstd::string dt(DateTimeFormatter::format(now, _format))dt.append("\r\n")socket().sendBytes(dt.data(), (int) dt.length())} catch (Poco::Exception&e) { app.logger().log(e)} } 2.3 PoechantTCPConnectionFactory工厂模式不必多说,名字唬人,其实非常非常简单(准确的说设计模式大部分名字都唬人,但大部分都很有用,设计模式本身并不牛B,能把设计模式抽象提炼出来成我们现在认为很简单的这些模式的那几个人很牛B)。

1、UDP会丢失数据,聊天程序之所以不会丢失数据,因为它们自己实现了确认、检错、重传机制,相当于模拟了TCP;查询数据库当然要用TCP。

2、异步机制是由操作系统提供的,效率较高;从数据接收的层面上看,多线程的阻塞差不多类似于单线程的非阻塞,但是这种实现方式比较有局限性。认真阅读关于socket的文档或者计算机网络,就不会有不理解的地方了。

3、绝大多数情况下,服务器和客户端都会使用新的工作线程来交换数据。这个看具体应用。你多做几个socket相关的项目就知道了。

4、所谓的模式是指UDP和TCP吗?当然是TCP。当时这并不是程序员所必须关心的,因为ACCESS的客户端驱动会处理一切网络传输事务,让你就像访问本地的ACCESS一样。做过项目了一般不会有这类疑惑。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/230868.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存