19.13 Boost Asio 发送TCP流数据

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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125525.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Net2FTP轻松打造免费的Web文件管理器并公网远程访问

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Java安全架构 JCA、JCE、JSSE、JAAS

Java语言拥有三大特征&#xff1a;平台无关性、网络移动性和安全性&#xff0c;而Java安全体系结构对这三大特征提供了强大的支持和保证&#xff0c; Java安全体系结构总共分为4个部分&#xff1a; &#xff08;1&#xff09;JCA&#xff08; Java Cryptography Architecture…

Go defer简介

思考 开始之前&#xff0c;先考虑下下面的代码的执行结果&#xff1a; package mainimport "fmt"func test() int {i : 0defer func() {fmt.Println("defer1")}()defer func() {i 1fmt.Println("defer2")}()return i }func main() {fmt.Print…

EasyExcel 导出冻结指定行

导出的实体类 package org.jeecg.modules.eis.test;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.*; import lombok.Getter; import lombok.Setter; import org.apache.poi.ss.usermodel.HorizontalAlignment;import…

如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

通义千问, 文心一言, ChatGLM, GPT-4, Llama2, DevOps 能力评测

引言 “克隆 dev 环境到 test 环境&#xff0c;等所有服务运行正常之后&#xff0c;把访问地址告诉我”&#xff0c;“检查所有项目&#xff0c;告诉我有哪些服务不正常&#xff0c;给出异常原因和修复建议”&#xff0c;在过去的工程师生涯中&#xff0c;也曾幻想过能够通过这…

【VUE+ elementUI 实现动态表头渲染】

VUE elementUI 实现动态表头渲染 1、定义 columns&#xff08;表头数据&#xff09; 和 dataList&#xff08;表格数据&#xff09; data() {return {loading: false,dataList: [{ name: 张三, sex: 男, age: 18 },{ name: 林琳, sex: 女, age: 20 },{ name: 王五, sex: 男, …

已解决:rm: 无法删除“/opt/module/zookeeper-3.4.10/zkData/zookeeper_server.pid“: 权限不够

解决&#xff1a; ZooKeeper JMX enabled by default Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg Stopping zookeeper ... /opt/module/zookeeper-3.4.10/bin/zkServer.sh: 第 182 行:kill: (4149) - 不允许的操作 rm: 无法删除"/opt/module/zooke…

数据结构:串(定义,基本操作,存储结构)

目录 1.串的定义2.串的基本操作3.字符集编码4.串的存储结构1.顺序存储2.链式存储 1.串的定义 串&#xff0c;即字符串( String&#xff09;是由零个或多个字符组成的有限序列。 一般记为s ‘a1a2……an’ (n ≥0) 其中&#xff0c;S是串名&#xff0c;单引号括起来的字符序列是…

uniApp页面通讯

Uniapp 是一款基于 Vue.js 开发的框架&#xff0c;它可以用来开发多端应用&#xff0c;包括微信小程序、H5、APP 等。在 Uniapp 中&#xff0c;页面通讯分为三种方式&#xff1a;事件总线、Vuex 和 uni.$emit。 事件总线&#xff08;EventBus&#xff09;&#xff1a;事件总线是…

css设置浏览器表单自动填充时的背景

浏览器自动填充表单内容&#xff0c;会自动设置背景色。对于一般的用户&#xff0c;也许不会觉得有什么&#xff0c;但对于要求比较严格的用户&#xff0c;就会“指手画脚”。这里&#xff0c;我们通过css属性来设置浏览器填充背景的过渡时间&#xff0c;使用户看不到过渡后的背…

小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核

小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 因小程序尚未发布&#xff0c;订单中心不能正常打开查看&#xff0c;请先发布小程序后再提交订单中心PATH申请 初次提交…

IDEA 关闭SpringBoot启动Logo/图标

一、环境 1、SpringBoot 2.6.4 Maven POM格式 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></parent> 2、IDE…

系列二、Shiro的核心组件

一、核心组件 # 1、UsernamePasswordToken 封装了用户的登录信息&#xff0c;使用用户的登录信息来创建Token # 2、SecurityManager Shiro的核心组件&#xff0c;负责安全认证和授权 # 3、Subject Shiro的一个抽象概念&#xff0c;包含了用户信息 # 4、Realm 开发者自定义的模块…

Day25力扣打卡

打卡记录 寻找旋转排序数组中的最小值&#xff08;二分&#xff09; 链接 由于是旋转排序数组&#xff0c;所以整个数组有两部分是递增的&#xff0c;选取右侧最后元素&#xff0c;即可将整个数组分为大于该元素和小于该元素&#xff0c;碰头地段即为最小值。 class Solutio…

探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用

目录 一、什么是海外服务器 二、不同主流海外云服务器对比 三、海外服务器的创建(亚马逊为例) 四、个人总结 一、什么是海外服务器 亚马逊云科技海外服务器&#xff1a;指的是部署在世界各地的亚马逊数据中心中的服务器设备。这些服务器提供了计算、存储、数据库、网络等各…

最终前端后端小程序还有nginx配置

前端 前端 build 代码及其 放置位置 后端 nginx.conf 配置 user root;worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type a…

语音控制:基于ESP8266的DIY助手

随着智能家居的兴起&#xff0c;语音控制成为越来越受欢迎的方式。在本篇文章中&#xff0c;我们将向您介绍如何使用ESP8266构建一个基于语音控制的DIY助手。 第一步&#xff1a;硬件准备 在开始之前&#xff0c;您需要准备一些基础硬件&#xff0c;包括ESP8266模块、麦克风模…

【强化学习】结合Python实战深入分析原理

【文末送书】今天推荐一本强化学习领域优质Python算法书籍&#xff0c;揭密ChatGPT关键技术PPO和RLHF。 目录 前言时间旅行和平行宇宙强化学习策略梯度算法代码案例文末送书 前言 时间循环是一类热门的影视题材&#xff0c;其设定常常如下&#xff1a;主人公可以主动或被动的回…