Qt tcp 通信

10 篇文章 0 订阅

客户端部分代码:

# NCClien.pro

#-------------------------------------------------
#
# Project created by QtCreator 2015-11-30T10:38:00
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = NCClien
TEMPLATE = app


SOURCES += main.cpp\
        ncclien.cpp

HEADERS  += ncclien.h

FORMS    += ncclien.ui

// ncclien.h

#ifndef NCCLIEN_H
#define NCCLIEN_H

#include <QMainWindow>
#include <QtNetwork>

namespace Ui {
class NCClien;
}

class NCClien : public QMainWindow
{
    Q_OBJECT

public:
    explicit NCClien(QWidget *parent = 0);
    ~NCClien();

private slots:
    void displayError(QAbstractSocket::SocketError);

public:
    QTcpSocket* tcpSocket;  //套接字发收控制

private slots:
    void readMessage();
    void sendMessage(QString str);

    void on_Request_PButton_clicked();

    void on_Send_PButton_clicked();

private:
    quint16 blockSize;
    QString message;

private:
    Ui::NCClien *ui;
};

#endif // NCCLIEN_H

 

// ncclien.cpp

#include "ncclien.h"
#include "ui_ncclien.h"

NCClien::NCClien(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::NCClien)
{
    ui->setupUi(this);

    ui->IP_lineEdit->setText("127.0.0.1");
    ui->Port_lineEdit->setText("6666");

    tcpSocket = new QTcpSocket(this);
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
    blockSize = 0;
    tcpSocket->abort();
}

void NCClien::readMessage()  //读取消息
{
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_5_4);
    if(blockSize == 0)
    {
        if(tcpSocket->bytesAvailable() < (int)sizeof(quint16))
        {
            return;
        }
        in>>blockSize;
    }
    if(tcpSocket->bytesAvailable() < blockSize)
    {
        return;
    }
    in>>message;
//    qDebug()<<message;  //输出消息
//    sendMessage("hello server!!");
    ui->RecieveText->append(message);
    blockSize = 0;
}

void NCClien::sendMessage(QString str)   //发送消息
{
    QByteArray SendArray;
    QDataStream out(&SendArray, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_4);
    out<<(qint16) 0;  //强制类型转换
    out<<str;
    out.device()->seek(0);  //游标跑到第一个位置处
    out<<(quint16)(SendArray.size() - sizeof(quint16));

    //我们获取已经建立的连接的子套接字
    tcpSocket->write(SendArray);
}

void NCClien::displayError(QAbstractSocket::SocketError)
{
    qDebug()<<tcpSocket->errorString();  //输出错误信息
}

void NCClien::on_Request_PButton_clicked()
{
    tcpSocket->connectToHost(ui->IP_lineEdit->text(),
                             ui->Port_lineEdit->text().toInt());
}

void NCClien::on_Send_PButton_clicked()
{
    sendMessage(ui->SendText->toPlainText());
    ui->SendText->clear();
}

NCClien::~NCClien()
{
    delete ui;
}

 /服务端代码:

// NCServer.pro

#-------------------------------------------------
#
# Project created by QtCreator 2015-11-30T10:36:45
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = NCSever
TEMPLATE = app


SOURCES += main.cpp\
        ncserver.cpp

HEADERS  += ncserver.h

FORMS    += ncserver.ui

 

// NCServer.h

#ifndef NCSERVER_H
#define NCSERVER_H

#include <QMainWindow>
#include <QtNetwork>
#include <QIODevice>
#include <QMessageBox>

namespace Ui {
class NCServer;
}

class NCServer : public QMainWindow
{
    Q_OBJECT

public:
    explicit NCServer(QWidget *parent = 0);
    ~NCServer();

public:
    QTcpServer* tcpServer;   //网络程序服务器端
    QTcpSocket* tcpSocket;   //网络通信套接字发受部分

private:
    quint16 blockSize;
    bool b_connect;

private slots:
    void sendMessage(QString str);
    void CreateTcp();   //创建tcp对象
    void readMessage();

    void on_Listen_PButton_clicked();

    void on_Send_PButton_clicked();

private:
    Ui::NCServer *ui;
};

#endif // NCSERVER_H

 

 

// NCServer.cpp

#include "ncserver.h"
#include "ui_ncserver.h"

NCServer::NCServer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::NCServer)
{
    ui->setupUi(this);

    ui->IP_lineEdit->setText("127.0.0.1");
    ui->Port_lineEdit->setText("6666");

    b_connect = false;
    blockSize = 0;
    tcpServer = new QTcpServer(this);
}

void NCServer::CreateTcp()
{
    tcpSocket = tcpServer->nextPendingConnection();  //初始化tcp套接字的变量,此时开始套接字才可以使用
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));  //绑定读取消息的基本操作
    b_connect = true;  //表示已经连接起来
}

void NCServer::sendMessage(QString str)
{
    if(b_connect)
    {
        QByteArray SendArray;
        QDataStream out(&SendArray, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_5_3);
        out<<(qint16) 0;  //强制类型转换
        out<<str;
        out.device()->seek(0);  //游标跑到第一个位置处
        out<<(quint16)(SendArray.size() - sizeof(quint16));

        //我们获取已经建立的连接的子套接字
        tcpSocket->write(SendArray);
    }
    else
    {
        QMessageBox::critical(this, tr("警告!!"), tr("断开状态请连接"), QMessageBox::Ok);
    }
}

void NCServer::readMessage()
{
    QString message;
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_5_4);
    if(blockSize == 0)
    {
        if(tcpSocket->bytesAvailable() < (int)sizeof(quint16))
        {
            return;
        }
        in>>blockSize;
    }
    if(tcpSocket->bytesAvailable() < blockSize)
    {
        return;
    }
    in>>message;
    qDebug()<<message;  //输出消息
    ui->RecievText->append(message);
    blockSize = 0;
}

void NCServer::on_Listen_PButton_clicked()  //开始监听
{
    bool ListenOk = tcpServer->listen((QHostAddress)ui->IP_lineEdit->text(),
                                      ui->Port_lineEdit->text().toUInt());
    if(!ListenOk)  //如果监听出现错误
    {
        qDebug()<<tcpServer->errorString();
        close();
    }
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(CreateTcp()));
}

void NCServer::on_Send_PButton_clicked()
{
    sendMessage(ui->SendText->toPlainText());
    ui->SendText->clear();
}

NCServer::~NCServer()
{
    delete ui;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值