需要包含三个头文件
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>
需要添加一个模块
QT += core gui network
使用到了两个类(QTcpServer、QTcpSocket)
QTcpServer Class
QTcpSocket Class
声明两个对象
QTcpServer *tcpServer;
QTcpSocket *tcpSocket;
涉及到的信号:
tcpServer:
newConnection()(This signal is emitted every time a new connection is available.)(这个信号在每次有新的连接可用时发出。)
tcpSocket:
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);
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
/*信号与槽的关联,此处信号为newConnection(),槽函数为newConnection_Slot()*/
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
}
/*建立新连接槽函数*/
void Widget::newConnection_Slot()
{
tcpSocket = tcpServer->nextPendingConnection();
/*信号与槽的关联,此处信号为readyRead(),槽函数为readyRead_Slot()*/
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
}
/*读取数据槽函数*/
void Widget:: readyRead_Slot()
{
QString buf;
buf = tcpSocket->readAll();
ui->recvEdit->appendPlainText(buf);
}
/*析构函数*/
Widget::~Widget()
{
delete ui;
}
/*按键槽函数*/
/*打开(监听)服务器*/
void Widget::on_openBt_clicked()
{
tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());
}
/*关闭服务器*/
void Widget::on_closeBt_clicked()
{
tcpServer->close();
}
/*发送信息到客户端*/
void Widget::on_pushButton_clicked()
{
tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}
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 <QTcpServer>
#include <QTcpSocket>
#include <QString>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QTcpServer *tcpServer;
QTcpSocket *tcpSocket;
private slots:
/*槽函数*/
void on_openBt_clicked();
void newConnection_Slot();
void readyRead_Slot();
void on_closeBt_clicked();
void on_pushButton_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、listen函数
告诉服务器在地址地址和端口端口上监听传入的连接。如果“port”为“0”,则自动选择端口。如果address是QHostAddress::Any,服务器将监听所有的网络接口。成功回报真;否则返回false。
函数声明:
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
参数:
(1)address
允许接入的地址。如果address是QHostAddress::Any,服务器将监听所有的网络接口。
(2)port
端口号。如果“port”为“0”,则自动选择端口。
返回值:
成功回报真;否则返回false。
例子:
tcpServer->listen(QHostAddress::Any,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
(Closes the server. The server will no longer listen for incoming connections.)
关闭服务器。服务器将不再监听传入的连接。
例子:
tcpServer->close();
实现效果:
