淮海工学院linux实验报告三,作业三 实验报告
作業(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ù)器端界面
當(dāng)用戶在信息輸入框中輸入字符,點擊發(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ā)送,當(dāng)服務(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ù)塊的大小為指定大小,每當(dāng)有數(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ù)。而在客戶端,當(dāng)有數(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ù)端,當(dāng)然也能從服務(wù)端下載到客戶端,方法是一樣的,首先在客戶端輸入要在服務(wù)器端下載的文件名稱,發(fā)送到服務(wù)器,服務(wù)器接收到名稱然后去指定的文件夾下去查找,如果有則將這個文件傳送到客戶端,如果沒有則斷開連接。
總結(jié)
以上是生活随笔為你收集整理的淮海工学院linux实验报告三,作业三 实验报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux如何禁用rc4加密算法,使用a
- 下一篇: linux文件历史,Linux文件系统的