客户端部分代码:
# 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;
}