qt-tcp发送和接收识别

来源:互联网 发布:php冒泡排序法 编辑:程序博客网 时间:2024/06/05 11:47

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;i<clientindex;i++)    {        QString rev(client[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()<<client[clientindex].ip;//  qDebug()<<client[clientindex].client->peerName();//  qDebug()<<client[clientindex].client->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读取到的是计算机的用户名,但是,,我不到,这很忧伤,试了各种办法,就是读不到,

0 0
原创粉丝点击