Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。

首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调用acceptor.accept(*tcp_stream.rdbuf())接收客户端的相应请求,并使用<<符号向建立了链接的文件内追加字符串数据。

#include <iostream>
#include <fstream>
#include <boost/asio.hpp> using namespace std;
using namespace boost;
using namespace boost::asio; // 利用流获取文件大小
long GetFileSize(std::string filename)
{
long ref_kb;
std::ifstream ptr(filename, std::ios::in | std::ios::binary); if (ptr.is_open() == true)
{
ptr.seekg(0, std::ios::end); // 移动到末尾
ref_kb = ptr.tellg(); // 获取字节数
ptr.close();
return ref_kb;
}
return 0;
} // 一次性读入,并循环输出
void ReadAllFile(std::string filename)
{
char *buffer;
long size; std::ifstream ptr(filename, std::ios::in | std::ios::binary | std::ios::ate); size = ptr.tellg();
std::cout << "总大小: " << size << std::endl; ptr.seekg(0, std::ios::beg);
buffer = new char[size]; ptr.read(buffer, size);
ptr.close(); // 循环输出逐字节输出
for (int x = 0; x < size; x++)
{
if (buffer[x] != '\0')
{
std::cout << buffer[x];
}
}
delete[] buffer;
} // 每次读入一行,并输出
void ReadLineFileA(std::string filename)
{
std::ifstream ptr(filename);
std::string string;
while (std::getline(ptr, string))
{
std::cout << string.c_str() << std::endl;
}
} void ReadLineFileB(std::string filename)
{
char buffer[1024];
std::fstream ptr; ptr.open(filename, std::ios::in | std::ios::binary); if (ptr.is_open() == true)
{
while (!ptr.eof())
{
// 该行长度到达1024或者遇到\n则结束
ptr.getline(buffer, 1024, '\n');
std::cout << buffer << std::endl;
}
}
} // 获取文本总行数
int GetFileLine(std::string filename)
{
char buffer[1024];
std::fstream ptr;
int line_count = 0; ptr.open(filename, std::ios::in | std::ios::binary); if (ptr.is_open() == true)
{
while (!ptr.eof())
{
ptr.getline(buffer, 1024, '\n');
line_count = line_count + 1;
}
}
return line_count;
} int main(int argc, char *argv[])
{
std::string file_path = "d://lyshark.txt"; // 获取行号
int count = GetFileLine(file_path);
std::cout << "行数: " << count << std::endl; // 发送数据流
io_service io;
ip::tcp::endpoint ep(ip::tcp::v4(), 6666);
ip::tcp::acceptor acceptor(io, ep); std::ifstream ptr(file_path);
std::string get_string;
while (std::getline(ptr, get_string))
{
ip::tcp::iostream tcp_stream;
acceptor.accept(*tcp_stream.rdbuf());
tcp_stream << get_string.c_str();
} std::system("pause");
return 0;
}

与服务端相比,客户端的代码则显得非常简单,在代码中我们只需要通过ip::tcp::iostream tcp_stream链接到服务端,并通过调用getline即可每次在流中获取一行数据,由于我们循环了3次,所有也就是只读取前三行。

#include <iostream>
#include <boost/asio.hpp> using namespace std;
using namespace boost::asio;
using namespace boost::system; int main(int argc, char *argv[])
{
// 循环从流中读入,前三行
for (int i = 0; i < 3; ++i)
{
ip::tcp::iostream tcp_stream("127.0.0.1", "6666");
string str;
getline(tcp_stream, str);
cout << str << endl;
} std::system("pause");
return 0;
}

读者可自行编译并运行上述代码片段,则可看到如下图所示的输出信息;

19.13 Boost Asio 发送TCP流数据的更多相关文章

  1. boost::asio::ip::tcp实现网络通信的小例子

    同步方式: Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. 头文件 #include <boost/asio.hpp> 名空 ...

  2. boost::asio::ip::tcp中几个重要类型

    typedef basic_stream_socket socket; 流式套接字,提供同/异步发送接收数据,连接,绑定,设置套接字选项等功能 对于socket中的connect()方法,它只针对某一 ...

  3. boost::asio::socket tcp 连接 在程序结束时崩溃。

    刚开始的时候一直不知道怎么回事,不过幸好我有在每个class 的析构时都打印一条信息. 这个时候发现我的一个tcp_connection (就是自定义的一个连接类) 在最后才被析构. 所以感觉这里可能 ...

  4. boost asio 学习(八) 网络基础 二进制写发送和接收

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=9 8. Net ...

  5. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

  6. boost asio tcp 多线程

    common/pools.h // common/pools.h #pragma once #include <string> #include <boost/pool/pool.h ...

  7. boost asio tcp 多线程异步读写,服务器与客户端。

    // server.cpp #if 0 多个线程对同一个io_service 对象处理 用到第三方库:log4cplus, google::protobuf 用到C++11的特性,Windows 需要 ...

  8. boost asio tcp server 拆分

    从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...

  9. boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Net ...

  10. Boost.Asio基本原理(CSDN也有Markdown了,好开森)

    Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...

随机推荐

  1. C++11实用特性1

    1 原始字面量 有时候在输出一个路径字符串时,编译器会将其中的部分内容识别成转义字符进行输出,可以用R "xxx(原始字符串)xxx"其中()两边的字符串可以省略.原始字面量R可以 ...

  2. 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~!

    全球最大同性交友网站 GitHub 是所有程序员的最爱,但是国内开发者访问Github 很不稳定,克隆开源项目也慢的离谱,常常clone失败. 之前大家或绕道码云(GitLab)或修改host文件,但 ...

  3. 【计算机网络】WebSocket 是什么原理?为什么可以实现持久连接?

    一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接),循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的 ...

  4. SpringBoot 项目实战 | 瑞吉外卖 Day03

    该系列将记录一份完整的实战项目的完成过程,该篇属于第三天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 公共字段自动填充 新添分 ...

  5. jdk1.8(java8)新特性

    借鉴之:https://blog.csdn.net/qq_28410283/article/details/80601495 Lambda 表达式: //1.Lambda 表达式,也可称为闭包,它是推 ...

  6. java中除法结果不对。

    今天遇一个非常简单地计算,计算结果居然是不对0,查了一些前辈们的资料动手实验了一下,实验结果和代码分享给大家.需要计算的公式:(7/10)*0.8 结果居然不是0.56 而是 0,最后找到原因(7/1 ...

  7. vue <a>标签 href 是参数的情况下如何使用

    想在页面中使用a标签打开一个新页面进行跳转 例如:msgZi.blogAddress 的值是 https://www.baidu.com 正确的写法: <a :href="goBlog ...

  8. SNMP 使用总结

    转载请注明出处: 1.SNMP简介 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于网络设备和系统的管理协议.它允许网络管理员监控和管理网络 ...

  9. 项目使用 GlobalExceptionHandler 自定义异常 一

    博主原创,未经允许不得转载: 每个项目都有自己的一套异常类的定义.总结一下,项目中使用自定义异常比较好的封装. 1.定义项目中统一使用的异常类,用于捕获项目中的自定义异常等: package com. ...

  10. 【linux】虚拟机 ubuntu 使用 sudo apt-get install 安装软件出现 “Unable to locate package xxx ”解决方法

    使用 sudo apt-get install 安装软件出现如下错误 上述错误表示找不到软件源,可更改软件源服务器解决 还有工具链 arm-none-eabi-gcc 实际安装的是 sudo apt ...