需要包含三个头文件
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>
需要添加一个模块
QT += core gui network
使用到了一个类(QTcpSocket)
QTcpSocket Class
声明一个对象
QTcpSocket *tcpSocket;
涉及到的信号:
tcpSocket:
connected()(This signal is emitted after connectToHost() has been called and a connection has been successfully established.)(此信号是在调用connectToHost()并成功建立连接之后发出的。)
readyRead()(This signal is emitted once every time new data is available for reading from the device’s current read channel.)(每当有新的数据可以从设备当前的读通道读取时,这个信号就会发出一次。)
客户端程序大致流程图
widget.cpp程序
#include "widget.h"
#include "ui_widget.h"
/*构造函数*/
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
tcpSocket =new QTcpSocket(this);
}
/*readyRead()信号执行的槽函数*/
void Widget:: connected_Slot()
{
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
}
void Widget:: readyRead_Slot()
{
ui->recvEdit->appendPlainText(tcpSocket->readAll());
}
/*析构函数*/
Widget::~Widget()
{
delete ui;
}
/*按键槽函数*/
void Widget::on_connBt_clicked()
{
tcpSocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toUInt());
connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_Slot()));
qDebug() << "client send connect";
}
void Widget::on_closeBt_clicked()
{
tcpSocket->close();
qDebug() << "client close success";
}
void Widget::on_sendBt_clicked()
{
tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
qDebug() << "client send success";
}
main.cpp程序
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.setWindowTitle("客户端");
w.show();
return a.exec();
}
widget.h程序
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QTcpSocket *tcpSocket;
private slots:
void on_connBt_clicked();
void connected_Slot();
void readyRead_Slot();
void on_closeBt_clicked();
void on_sendBt_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
注:
1、connect函数
函数声明
bool QObject::connect ( const QObject * sender, const char * signal,
const QObject * receiver, const char * member ) [static]
参数:
(1)const QObject * sender
填写对象名
(2)const char * signal
填写信号名。
格式:SIGNAL(xxx),xxx填写信号名。
(3)const QObject * receiver
this关键字是一个指向对象自己的一个指针
(4)const char * member
填写槽函数名。
格式:SLOT(xxx),xxx填写槽函数名。
例子:
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
2、readAll函数
无参数。
从设备中读取所有剩余数据,并将其作为字节数组返回。
这个函数没有报告错误的方法;返回一个空的QByteArray可能意味着当前没有数据可供读取,或者发生了错误。
返回值:
成功读取,将数据作为字节数组返回。失败读取,返回一个空的QByteArray可能意味着当前没有数据可供读取,或者发生了错误。
例子:
/*将读取的数据存入buf*/
QString buf;
buf = tcpSocket->readAll();
3、connectToHost函数
尝试连接到给定端口上的主机名。协议参数可以是尝试连接到端口上的地址。
函数声明:
virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)
参数:
(1)address
接入的ip地址。格式如:192.168.1.1
(2)port
端口号。如果“port”为“0”,则自动选择端口。
(3)OpenMode
可不写
注:connectToHost是一个重载函数,还有一个函数类型。
例子:
tcpSocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toUInt());
4、write函数
(Writes data from a zero-terminated string of 8-bit characters to the device. Returns the number of bytes that were actually written, or -1 if an error occurred.)
(将以0结束的8位字符串的数据写入设备。返回实际写入的字节数,如果发生错误则返回-1。)
函数声明
write(const char *data)
返回值
返回实际写入的字节数,如果发生错误则返回-1。
例子:
tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
5、close
关闭设备。首先发出aboutToClose(),然后关闭设备并将其OpenMode设置为NotOpen。错误字符串也被重置。
例子:
tcpSocket->close();
实现效果: