TCP/IP 简单实现

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();
    }
}

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值