您的位置:首页 > 理论基础 > 计算机网络

Qt tcp 通信

2015-11-30 18:20 471 查看
客户端部分代码: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;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: