淮海工学院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实验报告三,作业三 实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux如何禁用rc4加密算法,使用a
- 下一篇: linux文件历史,Linux文件系统的