服务器端和客户端代码

acceptor(ios,TCP::endpoint(TCP::v4(),8050));//初始化acceptor,服务器在8050端口监听
sock_pt sock(new TCP::socket(ios));//初始化socket
acceptor.async_accept(*sock,boost::bind(&SoLDMServer::accept_handler,
this,boost::asio::placeholders::error,sock));//服务器接受一个连接请求


//序列化部分,首先接收客户端发来的数据
SendToSever sts;
int size = 0;
boost::asio::read(*sock, boost::asio::buffer(&size, sizeof(int)));
boost::asio::streambuf buf;//创建接收消息的流buffer
boost::asio::read(*sock, buf, boost::asio::transfer_exactly(size));//接收到消息数据
boost::archive::binary_iarchive ia(buf);//将数据从归档的二进制流中恢复
ia>>sts;//从保存序列化数据的ia里面反序列化,得到原来的消息对象


//读取.dat文件
ifstream* myFileReader=new ifstream;
myFileReader->open(sts.DATFilePath.c_str(),ios::binary);
myFileReader->seekg(sts.myOffset, ios::beg);//定位到tile在.dat文件的偏移量处
char * m_buffer=new char[sts.unitsize*sts.dataSize];
myFileReader->read((char*)m_buffer, sts.unitsize * sts.dataSize);//读取所需的tile数据

 
 
//构造消息发送给客户端
RecieveFromSever rfs;//构造消息对象
vector<char> temp(m_buffer,m_buffer+sts.unitsize*sts.dataSize);
rfs.mybuffer=temp;
boost::asio::streambuf send_buf;//创建流buf进行序列化
boost::archive::binary_oarchive oa(send_buf);//将流buf归档成为二进制流
oa<<rfs;//将消息对象序列化
size = send_buf.size();
boost::asio::write(*sock, boost::asio::buffer(&size, sizeof(int)));//发送序列化的流数据给客户端
boost::asio::write(*sock, send_buf, boost::asio::transfer_exactly(size));

//客户端与服务进行连接
boost::asio::io_service ios;
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address_v4::from_string("127.0.0.1"),8050);
boost::asio::ip::tcp::socket sock(ios);//创建socket并进行连接
boost::system::error_code er;
sock.connect(ep,er);
if(er)//这里判断一下,否则没连上仍会通过
  throw boost::system::system_error(er);

//客户端构造请求消息
int unitSize = sizeof(dataType);
vector<int> fileIDIndex = m_LDMVolumeData->getOctree()->getFileIDIndex();
int fileID = fileIDIndex[tileID];//fileID是对应的tile在.dat文件中的存储位置
int tileSize = m_LDMVolumeData->getOctree()->getTileSize();
if( fileID == -1)
{
	memset(myBuffer,0,tileSize * tileSize * tileSize * unitSize);
	return;
}

int64_t myOffset = m_LDMVolumeData->getOffsetIndex().at(fileID);//根据fileID寻找在.dat文件中的偏移
int dataSize = m_LDMVolumeData->getDataSizeIndex().at(fileID);
SendToSever sts;//构造请求消息
sts.tileID=tileID;
sts.unitsize=unitSize;
sts.myOffset=myOffset;
sts.dataSize=dataSize;
sts.DATFilePath=DATFilePath;
boost::asio::streambuf buf;//进行消息序列化
boost::archive::binary_oarchive oa(buf);
oa<<sts;


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值