QTcpServer的基本操作: 1、调用listen监听端口。 2、连接信号newConnection,在槽函数里调用nextPendingConnection获取连接进来的socket。
QTcpSocket的基本能操作: 1、调用connectToHost连接服务器。 2、调用waitForConnected判断是否连接成功。 3、连接信号readyRead槽函数,异步读取数据。 4、调用waitForReadyRead,阻塞读取数据。
服务器端
- 新建一个服务器端工程,填入
QT += network复制代码
#include复制代码
- mainwindows.h文件中加入成员
public: void init();private slots: void sendMessage(); //发送消息 void onReciveData(); //接收数据 void newListen(); //建立tcp监听事件 void acceptConnection(); //接收客户端连接 void showError(QAbstractSocket::SocketError); //错误输出private: QTcpSocket *tcpSocket; QTcpServer *tcpServer; // QTimer *timer;复制代码
- 函数的定义
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); init(); setWindowTitle(QString::fromLocal8Bit("Server")); connect(ui->sendBtn,SIGNAL(clicked(bool)),SLOT(sendMessage()));}复制代码
构造函数中,调用init()函数,当点击了发送按钮就会产生一个槽函数sendMessage,然后直接调用这个槽函数。
void MainWindow::init(){ // timer = new QTimer; tcpServer = new QTcpServer; tcpSocket = new QTcpSocket; newListen(); connect(tcpServer,SIGNAL(newConnection()),SLOT(acceptConnection())); connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),SLOT(showError(QAbstractSocket::SocketError)));}复制代码
新建一个QTcpServer类的对象,和QTcpSocket类的对象。调用newlisten()监听服务器的socket请求函数,有新的连接的时候,调用acceptConnection()函数,失败的话调用showError()。
void MainWindow::newListen(){ if(!tcpServer->listen(QHostAddress::Any,6666)) { qDebug()<errorString(); tcpServer->close(); }}复制代码
QHostAddress::Any 4 双any-address栈,与该地址绑定的socket将侦听IPv4,6666端口。
void MainWindow::acceptConnection(){ tcpSocket = tcpServer->nextPendingConnection(); connect(tcpSocket,SIGNAL(readyRead()),SLOT(onReciveData()));}复制代码
连接成功后,连接信号readyRead(),调用onReciveData()。
void MainWindow::sendMessage() //发送数据{ QString textEdit = ui->lineEdit->text(); QString strData =QString::fromLocal8Bit("Time: ") + QTime::currentTime().toString() + "\n" + textEdit.toLocal8Bit() + "\n"; QByteArray sendMessage = strData.toLocal8Bit(); mChat += ("Send " + sendMessage); ui->textEdit->setText(mChat); tcpSocket->write(sendMessage);}void MainWindow::onReciveData() //读取数据{ QString data = tcpSocket->readAll(); qDebug()< textEdit->setText(mChat);}复制代码
发送数据,获取编辑框中的字符串,发送。