qt-tcp发送和接收识别

tcp的传输方式是1:N的模式,
也就是一个服务器,对应多个客户端。
在使用的过程中,怎么区分客户端哪个是那个,谁是谁,是很重要的一个问题,
今天琢磨了好久,虽然最后失败了,还是写上来,大致了解一下,

1:客户端连接服务端。
这个就是运用到了qt的槽机制,自动的生成了线程,可以自动的获取客户端发送的数据,

// 新建tcp链接
void updComm::initTcp()
{
    int port = ui->comboBox->currentText().toInt();
    tcpSocket = new QTcpServer(this);
    tcpSocket->listen(QHostAddress::Any,port);
    connect(tcpSocket,SIGNAL(newConnection()),this,SLOT(readPendingDatagrams()));
    connect(tcpSocket,SIGNAL(destroyed()),this,SLOT(desConect()));
}

//从客户端读取数据
void updComm::readdataforclient()
{
    for(int i=0;iclient[i].client->readAll());
        if(!rev.isEmpty())
        {

            ui->tedRev->append(rev);
            setRevNum(rev.size());
        }
    }
}

写的这个接收客户端数据的代码有点粗糙,但大概就是这个思路,

2,保存客户端链接
客户端连接之后,会触发newConnection这个槽机制,这样就可以很方便的读取到客户端的数据了,
下面是获取客户端ip,name,端口的代码,

//获取tcp链接的对象,
void updComm::readPendingDatagrams()
{    

    client[clientindex].client = tcpSocket->nextPendingConnection();

    client[clientindex].name =client[clientindex].client->peerName();
    client[clientindex].ip = client[clientindex].client->peerAddress();
    client[clientindex].port = client[clientindex].client->peerPort();

    ui->combox_ip->addItem(client[clientindex].ip.toString());

    //ui->tedSend->append("address:"+tcpSocket->nextPendingConnection()->peerAddress().toString());
    //ui->tedSend->append("username:"+tcpSocket->nextPendingConnection()->peerName());



//    qDebug()<
//  qDebug()<peerName();
//  qDebug()<peerPort();
    connect(client[clientindex].client,SIGNAL(readyRead()),this,SLOT(readdataforclient()));
    QString data = tr("wxc");
    client[clientindex].client->write(data.toLatin1());
    clientindex++;
}

之后就算是存储了所有客户端的信息,在发送的时候,可以根据IP或者name区别客户端是哪个,然后直接发送数据,而且有了ip地址之后,可以直接使用udp进行通讯,这样就可以可以tcp传输文件,udp传输数据,进行通讯,和保持心跳了,

ps:peer是qt的一个内别,指的是客户端的一些数据,
peername读取到的是计算机的用户名,但是,,我不到,这很忧伤,试了各种办法,就是读不到,

你可能感兴趣的:(QT)