Qt5.2 使用qtcpsocket 传送消息
2014-02-20 13:46
288 查看
具体实现如图所示:
主要分为客户端和服务器两个部分。客户端向服务器发出请求,服务器收到后连接,连接成功后发送数据给客户端,客户端触发readyread信号,调用readMessage()方法读取数据。
服务器端主要是负责监听本地端口,这里使用的端口号是6666,一旦服务器监听到客户端的请求,就会触发newConnection 信号,就会紧接着调用槽函数,向客户端发送数据。
下面首先介绍一下客户端实现的整个过程。在.pro 文件中药加入 network 模块
widget.h具体代码如下,
widget.cpp具体代码如下:
服务器端代码如下Widget.h:
//Widget.cpp代码如下;
这样,客户端就可以发送请求服务器端连接,连接成功后发送数据客户端就可以接受数据了。
主要分为客户端和服务器两个部分。客户端向服务器发出请求,服务器收到后连接,连接成功后发送数据给客户端,客户端触发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");
}
这样,客户端就可以发送请求服务器端连接,连接成功后发送数据客户端就可以接受数据了。
相关文章推荐
- 使用QTcpSocket接收数据
- QTcpSocket QTcpServer 类的使用方法
- 关于使用QTcpSocket的一些总结
- [转] - 如何用QTcpSocket传送图片
- linux qt+windows mfc利用socket传送消息
- 关于使用QTcpSocket的一些总结
- QTcpSocket使用过程中的一些问题记录
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
- QTcpServer+QTcpSocket使用整理
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
- 关于使用QTcpSocket的一些总结
- 如何用QTcpSocket传送图片
- QTexstStream的操作对象是QIODevice(因此QFile,QBuffer,QProcess,QTcpSocket都可以使用),或者QString
- Qt使用socket传送图片
- QT使用QTcpSocket和QTcpServer通信是出现乱码的问题
- QT 使用 QTcpSocket来检测 ip 设备的网络状态
- Qt的QTcpSocket的readyRead信号使用体会
- QT5使用QTcpSocket类注意事项
- Qt QTcpSocket使用总结
- QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)