日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

作業三 實驗報告

網絡通信 文件傳輸

實驗一

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实验报告三,作业三 实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。