日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

淮海工学院linux实验报告三,作业三 实验报告

發(fā)布時間:2025/3/21 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 淮海工学院linux实验报告三,作业三 实验报告 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作業(yè)三 實驗報告

網(wǎng)絡(luò)通信 文件傳輸

實驗一

1-1 實驗題目

服務(wù)器端和客戶端各傳遞1次字符串。考慮到使用TCP協(xié)議,所以傳遞字符串前先以4字節(jié)整數(shù)型方式傳遞字符串長度。連接時服務(wù)器端和客戶端數(shù)據(jù)傳輸格式如下:

圖1-1 傳輸數(shù)據(jù)格式

1-2 實驗思路

從題目中可以看出首先將用戶輸入到文本框中的數(shù)據(jù)進行解析,看看到底有多少個字符,然后在將字符數(shù)據(jù)和后面的信息一起發(fā)過去,在題目中,我們很容易看到一共是四個字節(jié)來記錄文本的數(shù)據(jù),所以我們默認將這四個數(shù)據(jù)全都設(shè)為0,然后經(jīng)過對用戶輸入的信息分析之后在修改相應(yīng)的位數(shù)。

1-2 實現(xiàn)過程

界面設(shè)計如下:

圖1-2 客戶端界面

圖1-3 服務(wù)器端界面

當用戶在信息輸入框中輸入字符,點擊發(fā)送,服務(wù)器端就會返還回字符的個數(shù)加數(shù)據(jù)。

客戶端核心代碼如下:

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();

}

服務(wù)器端核心代碼如下:

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 實驗總結(jié)

通過本次實驗,對TCP通信有了進一步的認識,將字符的個數(shù)發(fā)送到服務(wù)器這里首先在客戶端進行數(shù)據(jù)的解析,通過計算算出一共有多少字符,然后一起和數(shù)據(jù)進行發(fā)送,當服務(wù)器接收到數(shù)據(jù)時,原封不動的將數(shù)據(jù)返回給客戶端,就像前面做過的迭代服務(wù)器一樣。

實驗二

2-1 實驗題目

創(chuàng)建收發(fā)文件的服務(wù)器端/客戶端,實現(xiàn)順序如下。

客戶端接收用戶輸入的傳輸文件名。

客戶端請求服務(wù)器端傳輸該文件名所指文件。

如果指定文件存在,服務(wù)器端就將其發(fā)送給客戶端;反之,則斷開連接。

2-2 實驗思路

考慮到本題目涉及到文件的傳輸,所以只實現(xiàn)了其中由客戶端選擇文件上傳到服務(wù)端,由于水平有限,所以只能是先到這一步。首先客戶端的界面如下:

圖2-1 客戶端運行界面

服務(wù)端的界面如下:

圖2-2 服務(wù)器端運行界面

首先客戶端打開文件,服務(wù)端選擇監(jiān)聽,然后哭護短選擇上傳文件,服務(wù)端開始接收文件,知道完成傳輸。

2-3 設(shè)計過程

實現(xiàn)文件的傳輸,在實際的文件傳輸以前,需要將整個傳輸數(shù)據(jù)的大小、文件名的大小還有文件名等信息放在數(shù)據(jù)的開頭進行傳輸,這里可以把他們統(tǒng)稱為文件頭結(jié)構(gòu)。數(shù)據(jù)是分為數(shù)據(jù)塊進行發(fā)送的,每次發(fā)送的數(shù)據(jù)塊的大小為指定大小,每當有數(shù)據(jù)發(fā)送時就更新進度條,如果數(shù)據(jù)發(fā)送完畢,便關(guān)閉本地文件和客戶端套接字。服務(wù)器端先分別接收了數(shù)據(jù)總大小、文件名大小及文件名等文件頭結(jié)構(gòu)的信息,然后才接受實際的文件。一旦建立連接,客戶端套接字便發(fā)射connected()信號,從而調(diào)用startTransfer()來發(fā)送頭文件結(jié)構(gòu)。這時服務(wù)器端發(fā)現(xiàn)有數(shù)據(jù)到來便更新進度條,在其中獲取發(fā)送過來的數(shù)據(jù)。而在客戶端,當有數(shù)據(jù)發(fā)送時,也會更新進度條,在其中將后面的數(shù)據(jù)庫發(fā)送出去。

客戶端核心代碼:

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();

}

}

服務(wù)器端代碼:

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 實驗總結(jié)

通過本次實驗,了解到文件在客戶端與服務(wù)器端的傳輸,相信文件能從客戶端上傳到服務(wù)端,當然也能從服務(wù)端下載到客戶端,方法是一樣的,首先在客戶端輸入要在服務(wù)器端下載的文件名稱,發(fā)送到服務(wù)器,服務(wù)器接收到名稱然后去指定的文件夾下去查找,如果有則將這個文件傳送到客戶端,如果沒有則斷開連接。

總結(jié)

以上是生活随笔為你收集整理的淮海工学院linux实验报告三,作业三 实验报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。