QT/C++ Socket如何创建多个连接
用Qt写了一个Tunnel
类,每次new这个类,构造函数都会socket连接到服务器,并与服务器保持通讯。
但是现在有个问题:每次new这个类,之前new的类里面的socket就会断开,我new了第一个,是正常的,new第二个,第一个类里面的socket就会断开,以此类推,ne十个,只有最后一个连接会是正常的,求大神帮忙看下,代码如下:
我是这样new的:
for(int i=0;i<=10;i++){
Tunnel *t=new Tunnel();
t->init(ExternData::userid,itemData.tunnelid,ExternData::token,itemData.server_ip,itemData.local_port,itemData.client_local);
t->startTunnel();
}
tunnel.h
#ifndef TUNNEL_H
#define TUNNEL_H
#include <QByteArray>
#include <QTcpSocket>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QFile>
#include <QJsonObject>
#include <QDebug>
#include <QJsonArray>
#include <QDebug>
#include <baseutility.h>
#include <packet.h>
#include <readwritetunnel.h>
#include <QMouseEvent>
#include <QObject>
class Tunnel : public QObject
{
Q_OBJECT
public:
Tunnel();
void init(int userid1,int id1,QString token1,QString server_ip1,int local_port1,QString local_ip1);
QByteArray qba;
bool startTunnel();
private slots:
void ClientRecvData();
private:
QTcpSocket* socket;//创建socket对象
};
#endif // TUNNEL_H
tunnel.cpp
#include "tunnel.h"
int userid;
int id;
QString token;
QString server_ip;
int local_port;
QString local_ip;
Packet *p2;
Tunnel::Tunnel(){
}
void::Tunnel::init(int userid1,int id1,QString token1,QString server_ip1,int local_port1,QString local_ip1)
{
userid=userid1;
id=id1;
token=token1;
server_ip=server_ip1;
local_port=local_port1;
local_ip=local_ip1;
p2=new Packet();
socket=new QTcpSocket(this);
}
bool Tunnel::startTunnel()
{
socket=new QTcpSocket();
//QString ip="127.0.0.1";
int port=8888;
socket->connectToHost(server_ip,port);
if(!socket->waitForConnected(3000)){
//QMessageBox::information(this,"QT网络通信","连接服务器失败");
return false;
}
//QMessageBox::information(this, "QT网络通信", "连接成功");
QJsonObject json;
json.insert("userid", userid);
json.insert("token",token);
json.insert("id", id);
json.insert("type", "LOGIN");
connect(socket,SIGNAL(readyRead()),this,SLOT(ClientRecvData()));
Packet *p1=new Packet(json,QString("login").toLatin1());
p1->Send1(socket);
return true;
}
void Tunnel::ClientRecvData(){
//这个是我自己写的packet类,用来解析服务器传过来的数据的
QByteArray data =p2->unPacket(socket,server_ip,local_port,local_ip);
if(data.isNull()){
return;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你connect不用指定端口的,多个socket用同一个端口就有问题了。
楼主,打扰了,请问一下,您这个问题是怎么解决的,我也遇到这个问题了,我是new两个socket类作为两个客户端分别去连接两个服务器,结果就是最后我这两个客户端线程都是对第二个服务器进行操作,比如给服务器发数据,就是这两个线程把数据都发给了第二个服务器,按理来说,我第一个客户端线程应该是发给第一个服务器的,感觉跟您这提的问题很像,所以想请问一下,您之后是怎么解决的