除了BOOST网站上的那个之外,有没有关于多线程客户端的好教程? 一个多线程客户端,可以处理向服务器发送数据的同时也打印服务器同时发送它的内容。 例如:用户正在输入并将其发送到服务器的线程,以及处理套接字并从服务器接收信息并在cout上打印信息的线程。
答案 0 :(得分:1)
您提供的链接是有关如何使用boost :: asio库的出色指南。 一旦了解了它的工作原理,你就可以在没有多个线程的情况下做你想做的事。
asio(异步IO)的想法是在io_service对象完成操作后回调您。每当你调用aync_xxx时,都会向它传递一个函数指针(或函子),一旦操作完成就会调用它。通过这种方式,您不必在轮询IO上单独阻塞线程。
例如,您希望在完成后从服务器读取消息。调用do_something(Message& msg)。这就是示例代码所做的。
由于TCP是基于流的协议,没有自然的消息边界,因此您必须在其上定义自己的消息格式。在该示例中,它为此目的定义了一个chat_message类。
要读取消息,客户端会执行以下步骤,在完成上一个async_xxx操作后,每个步骤都会因回调而触发。它还依赖于只有在读取指定的确切字节数或发生错误时async_read才完成的事实。
请注意,在示例中,它在调用async_read之前在步骤4中执行了“cout.write ...”。 您需要做的就是用do_something(msg)替换“cout.wirte ..”部分。
写入部分遵循类似的回调链,唯一的区别是当没有更多的消息要写时链断开,因此我们需要检查条件并重新启动它。