您的位置:首页 > 理论基础 > 计算机网络

Qt5.2 使用qtcpsocket 传送消息

2014-02-20 13:46 288 查看
具体实现如图所示:


主要分为客户端和服务器两个部分。客户端向服务器发出请求,服务器收到后连接,连接成功后发送数据给客户端,客户端触发readyread信号,调用readMessage()方法读取数据。

服务器端主要是负责监听本地端口,这里使用的端口号是6666,一旦服务器监听到客户端的请求,就会触发newConnection 信号,就会紧接着调用槽函数,向客户端发送数据。

下面首先介绍一下客户端实现的整个过程。在.pro 文件中药加入  network 模块

widget.h具体代码如下,

#ifndef WIDGET_H

#define WIDGET_H


#include <QWidget>

#include <QTcpSocket>

#include <QtNetwork>

#include <QString>

#include <QDataStream>

namespace Ui {

class Widget;

}


class Widget : public QWidget

{

Q_OBJECT


public:

explicit Widget(QWidget *parent = 0);

~Widget();


private slots:

void on_pushButton_clicked();//单击的时候连接服务器,向服务器发出请求

void readMessage();//接受数据

void displayError(QAbstractSocket::SocketError);  //显示错误


private:

Ui::Widget *ui;

QTcpSocket *client;

//存放服务器发送过来的字符串

QString message;

//存放字符串发送过来的大小信息。

qint16 blocksize;


};


#endif // WIDGET_H


widget.cpp具体代码如下:

#include "widget.h"

#include "ui_widget.h"

#include <QDebug>


Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

client=new QTcpSocket(this);

connect(client,SIGNAL(readyRead()),this,SLOT(readMessage()));//当服务器向客户端发送信息时,客户端触发readyRead()信号,调用槽函数readMessage()函数读取

connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));//错误提示


}


Widget::~Widget()

{

delete ui;

}


void Widget::on_pushButton_clicked()

{

blocksize=0;//设置存放字符串大小的初始值为0

client->abort();//取消连接

//连接到主机使用的是connectToHost命令,从界面取得主机号和端口号

client->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());

}


void Widget::readMessage()

{

QDataStream in(client);

in.setVersion(QDataStream::Qt_5_2);

//设置数据流版本,这里要和服务器端相同

if(blocksize==0) //如果是刚开始接收数据

{

//判断接收的数据是否有两字节,也就是文件的大小信息

//如果有则保存到blockSize变量中,没有则返回,继续接收数据

if(client->bytesAvailable() < (int)sizeof(quint16)) return;

in >> blocksize;

}

if(client->bytesAvailable() < blocksize) return;

//如果没有得到全部的数据,则返回,继续接收数据

in >> message;

//将接收到的数据存放到变量中

ui->messageLabel->setText(message);

//显示接收到的数据



}

void Widget::displayError(QAbstractSocket::SocketError)

{

qDebug() << client->errorString();

}



服务器端代码如下Widget.h:

#ifndef WIDGET_H

#define WIDGET_H


#include <QWidget>

#include <QtNetwork>

#include <QTcpSocket>

#include <QTcpServer>

#include <QHostAddress>

#include <QDebug>

#include <QByteArray>

#include <QDataStream>

#include <QIODevice>

namespace Ui {

class Widget;

}


class Widget : public QWidget

{

Q_OBJECT


public:

explicit Widget(QWidget *parent = 0);

~Widget();

private slots:

void sendMessage();

private:

Ui::Widget *ui;

QTcpServer *server;

};


#endif // WIDGET_H


//Widget.cpp代码如下;

#include "widget.h"

#include "ui_widget.h"


Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

server=new QTcpServer(this);

if(!server->listen(QHostAddress::LocalHost,6666))

{

qDebug() << server->errorString();

close();

}

else

{


connect(server,SIGNAL(newConnection()),this,SLOT(sendMessage()));

}

}


Widget::~Widget()

{

delete ui;

}


//发送信息

void Widget::sendMessage()

{

QByteArray block;

QDataStream  out(&block,QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_5_2);

out << (qint16)0;

out << tr("hello tcp");

out.device()->seek(0);

out << (qint16)(block.size()-sizeof(qint16));

//获得连接服务器的子套接字使用的是nextPendingConnection()

QTcpSocket *clientConnection =server->nextPendingConnection();

connect(clientConnection,SIGNAL(disconnected()),clientConnection,SLOT(deleteLater()));

clientConnection->write(block);

//表示发送完成后就会断开连接,发出disconnected()的信号,调用deleteLater()函数。

clientConnection->disconnectFromHost();

ui->label->setText("send message successful");

}


这样,客户端就可以发送请求服务器端连接,连接成功后发送数据客户端就可以接受数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: