您的位置:首页 > 编程语言 > Qt开发

QT学习点滴记录(四)

2014-09-22 14:43 423 查看

网络TCP(一)

一. 服务器端

1. 新建一个QT Gui Application,工程名为"TCPServer", Base Class 选择QWidget, 并在工程文件TCPServer.pro中添加一句代码:QT += network
2. 在widget.ui设计区添加一个Label, 更改其objectName为statusLabel, 用于显示一些状态信息



3. 修改widget.h文件
添加头文件:#include <QtNetWork>
添加private对象:
QTcpServer* m_TcpServer;
添加私有槽函数:
private slots:
void SendMessage();
4. 修改widget.cpp文件
在构造函数中添加如下代码:
m_TcpServer = new QTcpServer(this);
//监听本地主机的6666端口, 如果出错就输出错误信息, 并关闭
if(!m_pTcpServer->listen(QHostAddress::LocalHost,6666))
{
qDebug()<< m_pTcpServer->errorString();
close();
}
connect(m_pTcpServer,SIGNAL(newConnection()), this,SLOT(SendMessage()));
5.实现槽函数
voidWidget::SendMessage()
{
//用于保存要发送的数据
QByteArray block;
//使用数据流写入
QDataStream out(&block,QIODevice::WriteOnly);
//设置数据流的版本,客户端和服务端使用的版本要相同
out.setVersion(QDataStream::Qt_4_8);
out << (quint16)0;
out << tr("hello TCPClient!!!");
out.device()->seek(0);
out << (quint16)(block.size() -sizeof(quint16));
QTcpSocket* clientConnection =m_pTcpServer->nextPendingConnection();
connect(clientConnection,SIGNAL(disconnected()), clientConnection,SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
ui->statusLabel->setText("SendMessage Successful!!!");
}
6. 编译运行, 结果如下图:



二、客户端

1. 新建Qt Gui Application,工程名为“TCPClient”,Base class选择QWidget, 并在工程文件TCPClient.pro中添加一句代码:QT += network
2. 在widget.ui设计区中添加几个标签Label和两个Line Edit以及一个按钮Push Button, 其中主机名的objectName修改为“HostLineEdit”, 端口号的objectName修改为“PortLineEdit”, 收到的信息的objectName修改为“MessageLabel”



3. 修改widget.h
添加头文件:#include <QtNetWork>
添加私有成员变量:
QTcpSocket*m_pTcpSocket;
QString m_Message; //存放从服务器接收到的字符串
quint16 m_blockSize;//存放文件的大小信息
添加槽函数:
private slots:
void NewConnect();//连接服务器
void ReadMessage();//接收数据
voidDisplayError(QAbstractSocket::SocketError);//显示错误
voidon_pushButton_clicked();
4. 修改widget.cpp
在构造函数中添加如下代码:
m_pTcpSocket = newQTcpSocket(this);
connect(m_pTcpSocket,SIGNAL(readyRead()), this, SLOT(ReadMessage()));
connect(m_pTcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(DisplayError(QAbstractSocket::SocketError)));
实现槽函数:
voidWidget::NewConnect()
{
m_blockSize = 0;
//取消已有的连接
m_pTcpSocket->abort();
//连接到主机,这里从界面获取主机地址和端口号
m_pTcpSocket->connectToHost(ui->HostLineEdit->text(),ui->PortLineEdit->text().toInt());
}

voidWidget::ReadMessage()
{
QDataStream in(m_pTcpSocket);
in.setVersion(QDataStream::Qt_4_8);
if(m_blockSize == 0)
{
//判断接收的数据是否有两个字节, 也就是文件的大小信息, 没有则返回, 继续接收数据
if(m_pTcpSocket->bytesAvailable()< (int)sizeof(quint16))
{
return ;
}
//有就保存到m_blockSize中
in >> m_blockSize;
}

//如果没有得到全部的数据,则返回, 继续接收数据
if(m_pTcpSocket->bytesAvailable()< m_blockSize)
{
return ;
}
//将接收到的数据放到m_Message变量中
in >> m_Message;
//显示接收到的数据
ui->Messagelabel->setText(m_Message);
}

voidWidget::DisplayError(QAbstractSocket::SocketError)
{
//输出错误信息
qDebug() <<m_pTcpSocket->errorString();
}

void Widget::on_pushButton_clicked()
{
NewConnect();
}
5. 编译运行, 结果如下图:



6. 先运行服务端, 然后再运行客户端, 其中主机号输入“localhost”, 端口号“6666”, 效果如下图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: