QT学习点滴记录(四)

来源:互联网 发布:网络交友新时空ppt 编辑:程序博客网 时间:2024/05/23 17:20

网络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”, 效果如下图


0 0
原创粉丝点击