Server的实现:
1.对所要监听的端口通过QTCPServer的listen(QHostAddress::Any,port),进行监听;
2.绑定server的newConnection信号,当信号发出时,之心对应槽函数;
3.槽函数中通过socket去接收server的连接,即server->nextPendingConnection(),此时连接以完成;
4.绑定socket的readyread()信号到recive槽,此信号会在有消息传入是发出,此时在槽函数中通过socket->readAll(),进行读取即可。
Client的实现:
Client的实现与Server类似;
1.通过socket的connectToHost(host,port)连接到对应的server;
2.绑定socket的readyread()信号到recive槽,此信号会在有消息传入是发出,此时在槽函数中通过socket->readAll(),进行读取即可。
3.发送消息通过socket的write方法写入即可。
Server
#include <QtWidgets/QMainWindow>
#include "ui_TCPIP.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QKeyEvent>
class TCPIP : public QMainWindow
{
Q_OBJECT
public:
TCPIP(QWidget *parent = Q_NULLPTR);
private:
Ui::TCPIPClass ui;
private:
QTcpServer* server_;
QTcpSocket* socket_;
private slots:
void listen();
void send();
void hasNewConnection();
void recive();
protected:
void keyPressEvent(QKeyEvent* event) override;
};
#if _MSC_VER > 1600
#pragma execution_character_set("utf-8")
#endif
#include "QDateTime"
#include "TCPIP.h"
TCPIP::TCPIP(QWidget* parent)
: QMainWindow(parent)
, server_(Q_NULLPTR)
, socket_(Q_NULLPTR)
{
ui.setupUi(this);
server_ = new QTcpServer(this);
ui.btnSend->setEnabled(false);
}
void TCPIP::listen() {
if(ui.btnListen->text() == "监听") {
ui.btnListen->setText("断开");
ui.btnListen->setStyleSheet("background-color:#00FF00");
ui.btnSend->setEnabled(true);
const quint16 port = ui.port->value();
server_->listen(QHostAddress::Any, port);
connect(server_,&QTcpServer::newConnection,this,&TCPIP::hasNewConnection);
}
else {
ui.btnListen->setText("监听");
ui.btnListen->setStyleSheet("background-color:#E1E1E1");
ui.btnSend->setEnabled(false);
if(server_->hasPendingConnections()) {
socket_->disconnectFromHost();
socket_->close();
}
disconnect(server_, &QTcpServer::newConnection, this, &TCPIP::hasNewConnection);
}
}
void TCPIP::send() {
if(!server_->isListening()) {
return;
}
if(socket_ == Q_NULLPTR) {
return;
}
const QString temp = QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz") + "->" + ui.text_send->text();
const QByteArray data = ui.text_send->text().toLocal8Bit();
socket_->write(data);
ui.textEdit_Rec->append(temp);
}
void TCPIP::hasNewConnection() {
socket_ = server_->nextPendingConnection();
connect(socket_, &QTcpSocket::readyRead, this, &TCPIP::recive);
const QString ip = socket_->peerAddress().toString();
const qint16 port = socket_->peerPort();
const QString temp = QString("%3<-[%1:%2]:连接成功").arg(ip).arg(port).arg(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz"));
ui.textEdit_Rec->append(temp);
}
void TCPIP::recive() {
if (socket_ == Q_NULLPTR) {
return;
}
const QString ip = socket_->peerAddress().toString();
const qint16 port = socket_->peerPort();
QByteArray data = socket_->readAll();
const QString temp = QString("%3<-[%1:%2]:").arg(ip).arg(port).arg(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz"));
ui.textEdit_Rec->append(temp + QString::fromLocal8Bit(data));
}
void TCPIP::keyPressEvent(QKeyEvent* event) {
if(event->key() == Qt::Key_Return) {
send();
}
}
Client
#pragma once
#include <QTcpSocket>
#include <QtWidgets/QMainWindow>
#include "ui_TCPClient.h"
#include "QKeyEvent"
class TCPClient : public QMainWindow
{
Q_OBJECT
public:
TCPClient(QWidget *parent = Q_NULLPTR);
private:
Ui::TCPClientClass ui;
private:
QTcpSocket* socket_;
private slots:
void onConnect();
void send();
void recive();
protected:
void keyPressEvent(QKeyEvent* event) override;
};
#if _MSC_VER > 1600
#pragma execution_character_set("utf-8")
#endif
#include "TCPClient.h"
#include "QHostAddress"
#include "QDateTime"
class QMainWindow;
TCPClient::TCPClient(QWidget *parent)
: ::QMainWindow(parent)
, socket_(Q_NULLPTR)
{
ui.setupUi(this);
socket_ = new QTcpSocket(this);
connect(socket_,&QTcpSocket::connected,[=] {
ui.textEdit_Rec->append("连接服务器成功.");
});
connect(socket_, &QTcpSocket::readyRead, this, &TCPClient::recive);
}
void TCPClient::onConnect() {
if(ui.btnConnect->text() == "连接") {
ui.btnConnect->setText("断开");
ui.btnConnect->setStyleSheet("background-color:#00FF00");
const QString host = ui.ip->text();
const quint16 port = ui.port->value();
socket_->connectToHost(host, port);
}
else {
ui.btnConnect->setText("连接");
ui.btnConnect->setStyleSheet("background-color:#E1E1E1");
socket_->disconnectFromHost();
}
}
void TCPClient::send() {
if(socket_ == Q_NULLPTR) {
return;
}
const QString ip = socket_->peerAddress().toString();
const qint16 port = socket_->peerPort();
const QString temp = QString("%3->[%1:%2]:").arg(ip).arg(port).arg(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz"))+ ui.text_send->text();
const QString data = ui.text_send->text();
socket_->write(data.toLocal8Bit());
ui.textEdit_Rec->append(temp);
}
void TCPClient::recive() {
if (socket_ == Q_NULLPTR) {
return;
}
const QString ip = socket_->peerAddress().toString();
const qint16 port = socket_->peerPort();
const QByteArray array = socket_->readAll();
const QString temp = QString("%3<-[%1:%2]:").arg(ip).arg(port).arg(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz"));
ui.textEdit_Rec->append(temp + QString::fromLocal8Bit(array));
}
void TCPClient::keyPressEvent(QKeyEvent* event) {
if(event->key() == Qt::Key_Return) {
send();
}
}