作业三 实验报告

网络通信 文件传输

实验一

1-1 实验题目

服务器端和客户端各传递1次字符串。考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度。连接时服务器端和客户端数据传输格式如下:

图1-1 传输数据格式

1-2 实验思路

从题目中可以看出首先将用户输入到文本框中的数据进行解析,看看到底有多少个字符,然后在将字符数据和后面的信息一起发过去,在题目中,我们很容易看到一共是四个字节来记录文本的数据,所以我们默认将这四个数据全都设为0,然后经过对用户输入的信息分析之后在修改相应的位数。

1-2 实现过程

界面设计如下:

图1-2 客户端界面

图1-3 服务器端界面

当用户在信息输入框中输入字符,点击发送,服务器端就会返还回字符的个数加数据。

客户端核心代码如下:

voidtcp_client1::datatranslate()

{

QTextCodec*code=QTextCodec::codecForName("GBK");

QStringmessage=ui->lineEdit_meseg->text();

inta=0,b=0,c=0,d=0;

if(message.length()<10)

{

d=message.length();

}

elseif(message.length()<100)

{

d=message.length()%10;

c=message.length()/10;

}

elseif(message.length()<1000)

{

d=message.length()%10;

c=message.length()%100/10;

b=message.length()/100;

}

elseif(message.length()<10000)

{

d=message.length()%10;

c=message.length()%100/10;

b=message.length()%1000/100;

a=message.length()/1000;

}

QStringqa=QString::number(a);

QStringqb=QString::number(b);

QStringqc=QString::number(c);

QStringqd=QString::number(d);

QByteArraysa=code->fromUnicode(qa);

QByteArraysb=code->fromUnicode(qb);

QByteArraysc=code->fromUnicode(qc);

QByteArraysd=code->fromUnicode(qd);

QByteArraymes1=code->fromUnicode(message);

this->tcpSocket->write(sa+sb+sc+sd+mes1);

ui->lineEdit_meseg->clear();

}

服务器端核心代码如下:

voidtcp_server1::readdata()

{

QStringfromClient=tcpSocket->readAll();

QTextCodec*code=QTextCodec::codecForName("GBK");

QByteArraymes=code->fromUnicode(fromClient);

ui->char_num->setText(mes);

tcpSocket->write(mes);

}

1-3 运行效果图

图1-4 运行效果图

1-4 实验总结

通过本次实验,对TCP通信有了进一步的认识,将字符的个数发送到服务器这里首先在客户端进行数据的解析,通过计算算出一共有多少字符,然后一起和数据进行发送,当服务器接收到数据时,原封不动的将数据返回给客户端,就像前面做过的迭代服务器一样。

实验二

2-1 实验题目

创建收发文件的服务器端/客户端,实现顺序如下。

客户端接收用户输入的传输文件名。

客户端请求服务器端传输该文件名所指文件。

如果指定文件存在,服务器端就将其发送给客户端;反之,则断开连接。

2-2 实验思路

考虑到本题目涉及到文件的传输,所以只实现了其中由客户端选择文件上传到服务端,由于水平有限,所以只能是先到这一步。首先客户端的界面如下:

图2-1 客户端运行界面

服务端的界面如下:

图2-2 服务器端运行界面

首先客户端打开文件,服务端选择监听,然后哭护短选择上传文件,服务端开始接收文件,知道完成传输。

2-3 设计过程

实现文件的传输,在实际的文件传输以前,需要将整个传输数据的大小、文件名的大小还有文件名等信息放在数据的开头进行传输,这里可以把他们统称为文件头结构。数据是分为数据块进行发送的,每次发送的数据块的大小为指定大小,每当有数据发送时就更新进度条,如果数据发送完毕,便关闭本地文件和客户端套接字。服务器端先分别接收了数据总大小、文件名大小及文件名等文件头结构的信息,然后才接受实际的文件。一旦建立连接,客户端套接字便发射connected()信号,从而调用startTransfer()来发送头文件结构。这时服务器端发现有数据到来便更新进度条,在其中获取发送过来的数据。而在客户端,当有数据发送时,也会更新进度条,在其中将后面的数据库发送出去。

客户端核心代码:

voidClient::startTransfer()

{

localFile=newQFile(fileName);

if(!localFile->open(QFile::ReadOnly)){

qDebug()<

return;

}

totalBytes=localFile->size();

QDataStreamsendOut(&outBlock,QIODevice::WriteOnly);

sendOut.setVersion(QDataStream::Qt_4_0);

QStringcurrentFileName=fileName.right(fileName.size()-fileName.lastIndexOf('/')-1);

sendOut<

totalBytes+=outBlock.size();

sendOut.device()->seek(0);

sendOut<

bytesToWrite=totalBytes-tcpClient->write(outBlock);

ui->clientStatusLabel->setText(tr("已连接"));

outBlock.resize(0);

}

voidClient::updateClientProcess(qint64 numBytes)

{

bytesWritten+=(int)numBytes;

if(bytesToWrite>0){

outBlock=localFile->read(qMin(bytesToWrite,payloadSize));

bytesToWrite-=(int)tcpClient->write(outBlock);

outBlock.resize(0);

}else{

localFile->close();

}

ui->clientProgressBar->setMaximum(totalBytes);

ui->clientProgressBar->setValue(bytesWritten);

if(bytesWritten==totalBytes){

ui->clientStatusLabel->setText(tr("传送文件 %1 成功").arg(fileName));

localFile->close();

tcpClient->close();

}

}

服务器端代码:

voidServer::updateServerProgress()

{

QDataStreamin(tcpServerConnection);

in.setVersion(QDataStream::Qt_4_0);

if(bytesReceived<=sizeof(qint64)*2){

if((tcpServerConnection->bytesAvailable()>=sizeof(qint64)*2)&&(fileNameSize==0)){

in>>totalBytes>>fileNameSize;

bytesReceived+=sizeof(qint64)*2;

}

if((tcpServerConnection->bytesAvailable()>=fileNameSize)&&(fileNameSize!=0)){

in>>fileName;

ui->serverStatusLabel->setText(tr("接收文件 %1 ...").arg(fileName));

bytesReceived+=fileNameSize;

//QString dir="D:\\server\\";

/*QDir d;

d.mkpath(dir);*/

localFile=newQFile(dir+"\\"+fileName);

if(!localFile->open(QFile::WriteOnly)){

qDebug()<

return;

}

}else{

return;

}

}

if(bytesReceived

bytesReceived+=tcpServerConnection->bytesAvailable();

inBlock=tcpServerConnection->readAll();

localFile->write(inBlock);

inBlock.resize(0);

}

ui->serverProgressBar->setMaximum(totalBytes);

ui->serverProgressBar->setValue(bytesReceived);

if(bytesReceived==totalBytes){

tcpServerConnection->close();

ui->startButton->setEnabled(true);

ui->serverStatusLabel->setText(tr("接收文件 %1 成功!").arg(fileName));

}

}

2-4 实验总结

通过本次实验,了解到文件在客户端与服务器端的传输,相信文件能从客户端上传到服务端,当然也能从服务端下载到客户端,方法是一样的,首先在客户端输入要在服务器端下载的文件名称,发送到服务器,服务器接收到名称然后去指定的文件夹下去查找,如果有则将这个文件传送到客户端,如果没有则断开连接。

淮海工学院linux实验报告三,作业三 实验报告相关推荐

  1. 201671010460朱艺璇 实验三作业互评与改进报告

    实验三 作业互评与改进报告. 课程名称:2016级计算机科学与工程学院软件工程(西北师范大学) 作业要求链接: 实验三 任务一. 点评作业地址和点评内容: [北京航空航天大学)](https://ww ...

  2. 201671030125 曾佳 + 实验三作业互评与改进报告

    项目 内容 这个作业属于哪个课程? 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里? 实验三 作业互评与改进 我在这个课程的目标是? 按时完成老师给的任务,通过阅读别人的 ...

  3. 201671010426 孙锦喆 实验三作业互评与改进报告

    作业的要求在哪里 实验三作业互评与改进 任务一 从班级博客园的以下班级的软件工程第一次作业中各选一篇学生博文作业进行阅读并进行评论, 然后根据作业阅读情况完善自己的第一次作业 任务二 软件文档是软件开 ...

  4. linux程序设计项目报告,Linux程序设计实验报告大作业

    Linux程序设计实验报告大作业 实 验 报 告 课程名称: LINUX程序设计 学 院: 计算机学院 专 业: 软件工程 班 级: 14-3 姓 名: 张正锟 学 号: 201401061038 2 ...

  5. 计算机原理实验报告三,计算机组成实验报告3

    <计算机组成实验报告3>由会员分享,可在线阅读,更多相关<计算机组成实验报告3(6页珍藏版)>请在人人文库网上搜索. 1.计算机组成实验报告3淮海工学院计算机工程学院 实验报告 ...

  6. 201671010411.巩定定 实验三.作业互评与改进

    课程名称 2016西北师范大学计算机科学与工程学院软件工程 作业要求 实验三作业互评与改进 任务一 G梓妤 评论博客:https://www.cnblogs.com/buaaguzhanpeng/p/ ...

  7. 201671010438王奕晗 实验三 作业互评与改进

    实验三 作业互评与改进 实验目标 学习规范的博文(文档)写作. 理解软件工程各阶段文档的作用与意义,了解软件工程文档的国家标准及其规范. 实验内容 任务一 从班级博客园的以下班级的软件工程第一次作业中 ...

  8. linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建

    南京邮电大学通达学院 实 验 报 告 实验 实验三题目 嵌入式Linux开发环境的搭建 课程名称 嵌入式驱动开发实验 学院 专业 班 实验者学号同做者学号 08002210 姓名 毛骏超 同做者学号 ...

  9. python实验三答案_20192116 实验三《Python程序设计》实验报告

    20192116 2019-2020-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 1921 姓名: 饶欢 学号:20192116 实验教师: ...

最新文章

  1. “数学不行,还能干点啥?”面试官+CTO:干啥都费劲!
  2. 如何设计一门语言(七)——闭包、lambda和interface
  3. python中的生产者与消费者模式
  4. Oracle 20c 新特性:表空间缺省加密算法 TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM
  5. 服务器即将维护完成,新一轮大服务器即将开启:3月26日维护8小时
  6. 伯克利(Berkeley cs61b)git使用
  7. 关于cdd文件的配置
  8. 【2022年第十周周总结】拖延症啊。。。。算法题啊。。。。
  9. 进程系列(一)-进程基本概念
  10. python如何print日语_Python,如何打印日文、韩文、中文字符串
  11. 计算机子网掩码作用,什么是子网掩码 子网掩码的作用是什么?
  12. HBuilder开发旅游类APP(三) ----- 给APP添加底部导航栏(底部选项卡)
  13. ioc的概念和实现原理
  14. 【单片机】4.4 响应中断请求的条件
  15. 100个常见的php面试题和答案分享,精选php面试题及答案
  16. Particle for alexa smart home skill (3)
  17. RabbitMQ如何保证消息的可靠性
  18. [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点
  19. Node中实现一个简易的图片验证码流程
  20. solopi性能测试工具

热门文章

  1. python 笔记:读取mat文件
  2. 博弈论笔记1:囚徒困境与纳什均衡
  3. Matlab计时函数的使用
  4. 决策树ID3和C4.5算法Python实现源码
  5. hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法
  6. R语言-csv文件数据追加
  7. 一步一步打造Geek风格的技术博客
  8. 你所不知道的日志异步落库
  9. spring与memcache的整合
  10. Lesson 4.6 逻辑回归的手动实现