我的确碰到了这样的问题,代码如下:
mytcpserver.h
#ifndef MYTCPSERVER_H
#define MYTCPSERVER_H
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
class MyTcpServer : public QTcpServer
{
Q_OBJECT
public:
explicit MyTcpServer( QObject *parent = 0 );
bool myTcpServerListen( const int serverport, const int maxconnect );
void myTcpServerStop();
private:
QTcpServer* mytcpserver;
QTcpSocket* mytcpsocket;
QList<QTcpSocket*> mytcpsocketlist;
int maxtcpsocket;
private slots:
void tcpserver_recv_slot();
void tcpserver_connect_slot();
void tcpserver_display_error();
};
#endif // MYTCPSERVER_H
mytcpserver.cpp
#include "mytcpserver.h"
MyTcpServer::MyTcpServer(QObject *parent) :
QTcpServer(parent)
{
/// 声明TCP服务
mytcpserver = new QTcpServer( this );
mytcpsocket = new QTcpSocket( this );
connect(mytcpserver,SIGNAL(newConnection()),this,SLOT(tcpserver_connect_slot()));
}
bool MyTcpServer::myTcpServerListen( const int serverport, const int maxconnect )
{
/// 监听
if( false == mytcpserver->listen(QHostAddress::Any,serverport) )
{
qDebug() << QObject::tr( "ERROR: 绑定端口失败..." );
return false;
}
/// 设置槽及最大连接数
maxtcpsocket = maxconnect;
qDebug() << QObject::tr( "SUCCESS: 绑定服务器端口成功." );
return TRUE;
}
void MyTcpServer::myTcpServerStop( )
{
for( int i = 0; i < mytcpsocketlist.count(); i++ )
{
mytcpsocketlist.at(i)->close();
mytcpsocketlist.removeAt(i);
}
mytcpsocketlist.clear();
mytcpserver->close();
}
void MyTcpServer::tcpserver_connect_slot()
{
qDebug() << QObject::tr( "SUCCESS: 有客户端请求连接, 现已经接受请求数为:" ) << mytcpsocketlist.count();
if( mytcpsocketlist.count() <= maxtcpsocket )
{
qDebug() << QObject::tr( "SUCCESS: 客户端连接请求已接受..." );
mytcpsocket = mytcpserver -> nextPendingConnection();
connect(mytcpsocket,SIGNAL(readyRead()),this,SLOT(tcpserver_recv_slot()));
connect(mytcpsocket,SIGNAL(disconnected()),mytcpsocket,SLOT(deleteLater()));
mytcpsocketlist.append( mytcpsocket );
qDebug() << QObject::tr( "SUCCESS: 已接受请求数:" ) << mytcpsocketlist.count();
}
else
{
qDebug() << QObject::tr( "ERROR: 系统连接超过允许的最大上限..." );
}
}
void MyTcpServer::tcpserver_recv_slot()
{
qDebug() << QObject::tr( "SUCCESS: 客户端发送数据请求..." );
for( int i=0 ; i< mytcpsocketlist.count() ; i++ )
{
QByteArray inblock;
mytcpsocket = mytcpsocketlist.at(i);
if( mytcpsocket->isReadable() )
{
inblock = mytcpsocket->readAll();
QString inbuff = QString( inblock );
if( inbuff.length() == 0 )
{
qDebug() << QObject::tr( "ERROR: 客户端无数据传送, 连接编号: " ) << i << mytcpsocket->isReadable();
continue;
}
qDebug() << QObject::tr( "SUCCESS: 数据接收完成." );
qDebug() << inbuff << inblock.size();
/// 调用业务业务处理组件
QString outbuff;
/*
MyBusiness myBusiness;
myBusiness.MyBusMain( inbuff, outbuff );
*/
if( outbuff.length() == 0 )
{
outbuff = "transaction success.";
}
qDebug() << QObject::tr( "SUCCESS: 开始向客户端发送数据, 连接编号为: " ) << i;
qDebug() << QObject::tr( "SUCCESS: 向客户端返回数据..." );
/// 向客户端发送数据
mytcpsocket->write( outbuff.toAscii() );
/// 关闭TCP连接
mytcpsocketlist.replace(i, mytcpsocketlist.last() );
mytcpsocketlist.removeLast();
mytcpsocket->disconnectFromHost();
}
}
}
void MyTcpServer::tcpserver_display_error()
{
qDebug() << QObject::tr( "ERROR: 系统连接错误..." ) << mytcpserver->errorString();
}
同时建立多次连接后,会跑出N多SOCKET都发送readyRead信号,很郁闷。。。。。