qt tcp服务器端
// tcp.h
#include <QTcpServer>
#include <QTcpSocket>
#include <QObject>
class Tcp :public QThread
{
Q_OBJECT
public:
explicit Tcp( QObject *parent = 0);
~Tcp();
public slots:
void ReadData();
void callback();
void unconnect(QAbstractSocket::SocketError);
protected:
void run();
signals:
private:
QTcpServer* s_server;
QTcpSocket* s_socket;
}
监听连接客户端,接收客户端发送的数据信息,处理,返回
//tcp.cpp
#include <tcp.h>
#include <QByteArray>
#include <Qdebug>
Tcp::Tcp(QObject *parent):QThread(parent)
{
s_server = new QTcpServer();
s_server->listen(QHostAddress::Any, 3000);
connect(s_server,SIGNAL(newConnection()), this, SLOT(callback()));
}
Tcp::~Tcp()
{
}
void Tcp::callback()
{
LOG_INFO("new tcp connection ! \n");
s_socket = s_server->nextPendingConnection();
connect(s_socket,SIGNAL(readyRead()),this, SLOT(ReadData())); //连接信号槽
connect(s_socket, SIGNAL(error(QAbstractSocket::SocketError)),this,
SLOT(unconnect(QAbstractSocket::SocketError))); //断开连接信号槽
}
void Tcp::ReadData() //读取缓冲区数据
{
LOG_INFO("Deal Tcp Data.......");
QByteArray receive_buf = s_socket->readAll();
take_deal->deal_data(receive_buf); //接受的数据处理函数
}
void Tcp::unconnect(QAbstractSocket::SocketError)
{
int error = s_socket->error();
switch(error)
{
case QAbstractSocket::RemoteHostClosedError://客户端断开
{
QString hostAddress=s_socket->QAbstractSocket::peerAddress().toString();
qDebug() << "unconnerct : "<<hostAddress;
break;
}
default:
{
error = -1;
qDebug() << "unconnerct :xxxx "<<endl;
break;
}
}
}
void Tcp::send_data(QByteArray trans_data)
{
const char raw_head[] = {
0xff, 0xff, 0x00, 0x00
};
QByteArray data_head = QByteArray::fromRawData(raw_head, sizeof(raw_head));
trans_data.insert(0,data_head);
qint32 send_num = s_socket->write(trans_data.data(),trans_data.size());
qDebug() << "send_num = "<<send_num<<endl;
}
qt tcp客户端实现:
//tcp_client.h
#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>
class TcpClient : public QMainWindow
{
Q_OBJECT
public:
explicit TcpClient(QWidget *parent = 0);
~MyTcpClient();
private:
QTcpSocket *tcpClient;
void connectToHost(QString str);
void write_data(QString data);
private slots:
//客户端槽函数
void ReadData();
void ReadError(QAbstractSocket::SocketError);
};
连接服务器端,向服务器端发送数据信息,接收服务器返回数据处理,
#include <tcpClinet.h>
#include <QMessageBox>
#include <QByteArray>
TcpClient::TcpClient(QWidget *parent) : public(parent)
{
connectToHost("127.0.0.1");
connect(tcpClient, SIGNAL(readyRead()), this, SLOT(ReadData()));
connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)), \
this, SLOT(ReadError(QAbstractSocket::SocketError)));
}
void TcpClient::connectToHost(QString str) //str :ip
{
//connect
if(tcpClient != 0)
{
tcpClient->disconnectFromHost();
tcpClient->waitForDisconnected();
tcpClient->close();
tcpClient = 0;
}
tcpClient = new QTcpSocket(this);
tcpClient->connectToHost(str, port);
if(!tcpClient ->waitForConnected(500000)) //500s,未连接到server,停止
{
return;
}
}
void TcpClient::ReadData()
{
const char raw_head[4] = {(char)0x55,(char)0xaa,(char)0x00,(char)0x00};
QByteArray data_head = QByteArray::fromRawData(raw_head, sizeof(raw_head));
QByteArray buffer = tcpClient->readAll();
if(!buffer.isEmpty())
{
//data deal
}
}
void TcpClient::ReadError(QAbstractSocket::SocketError)
{
tcpClient->disconnectFromHost();
ui->btnConnect->setText(tr("连接"));
QMessageBox msgBox;
msgBox.setText(tr("failed connect server %1").arg(tcpClient->errorString()));
}
void TcpClient::write_data(QString data) //send to server
{
if(data != "")
{
tcpClient->write(data.toLatin1()); //
}
}