注意:服务器端在监听时,如果要接收其他主机的连接请求,需设置为
QHostAddress::Any
一、客户端实现
1.tcpclient.h
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QMainWindow>
#include <QtNetwork>
#include <QtNetwork/QTcpSocket>
namespace Ui {
class TcpClient;
}
class TcpClient : public QMainWindow
{
Q_OBJECT
public:
explicit TcpClient(QWidget *parent = 0);
~TcpClient();
protected:
void init();
void newTcpConnect(); //用于建立服务器端与客户端的连接函数
private:
Ui::TcpClient *ui;
QTcpSocket *tcpSocket;
private slots:
void receiveData(); //接收来自服务端的数据
void displayError(QAbstractSocket::SocketError);
};
#endif // TCPCLIENT_H
2.tcpclient.cpp
#include "tcpclient.h"
#include "ui_tcpclient.h"
#define ip "192.168.1.141"
#define port 8000
TcpClient::TcpClient(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TcpClient)
{
ui->setupUi(this);
init();
}
TcpClient::~TcpClient()
{
delete ui;
}
void TcpClient::init()
{
tcpSocket=new QTcpSocket(this);
newTcpConnect();
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(receiveData()));
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError)));
}
void TcpClient::receiveData()
{
QString datas=tcpSocket->readAll(); //接收字符串数据
ui->receiveLineEdit->setText(datas); //显示字符串数据
}
void TcpClient::newTcpConnect()
{
tcpSocket->abort();
tcpSocket->connectToHost(ip,port);
}
void TcpClient::displayError(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket->errorString();
tcpSocket->close();
}
1.tcpserver.h
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QMainWindow>
#include <QtNetwork>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QTcpServer>
#include <QTimer>>
namespace Ui {
class TcpServer;
}
class TcpServer : public QMainWindow
{
Q_OBJECT
public:
explicit TcpServer(QWidget *parent = 0);
~TcpServer();
protected:
void init(); //初始化函数用于完成一些诸如信号与槽之间的联系和变量初始化工作
private slots:
void on_sendButton_clicked();
void newListen(); //建立TCP监听事件
void acceptConnection(); //接收客户端连接
void displayError(QAbstractSocket::SocketError); //显示错误信息
private:
Ui::TcpServer *ui;
QTcpSocket *tcpSocket;
QTcpServer *tcpServer;
QTimer *timer;
};
#endif // TCPSERVER_H
2.tcpserver.cpp
#include "tcpserver.h"
#include "ui_tcpserver.h"
TcpServer::TcpServer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TcpServer)
{
ui->setupUi(this);
init();
}
TcpServer::~TcpServer()
{
delete ui;
}
void TcpServer::init()
{
timer=new QTimer;
this->tcpServer=new QTcpServer(this);
this->tcpSocket=new QTcpSocket(this);
newListen();
//当有客户端连接请求时发出信号,acceptConnection为信号处理函数
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
//当tcpSocket在接受客户端连接时出现错误,发出信号并处里
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError)));
}
void TcpServer::on_sendButton_clicked()
{
this->tcpSocket->write(ui->sendLineEdit->text().toLatin1());
}
void TcpServer::newListen()
{
if(!tcpServer->listen(QHostAddress::Any,8000))
{
qDebug()<<tcpServer->errorString();
close();
return;
}
}
void TcpServer::acceptConnection()
{
tcpSocket=tcpServer->nextPendingConnection();
}
void TcpServer::displayError(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket->errorString();
tcpSocket->close();
}
三、实现结果