本文主要是介绍扣扣2013 解析和问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
网上找到(基于扣踢的)类扣扣2013bug:每次当好友下线然后再上线时候,别的好友就无法识别了,仍旧认为好友不在线,无法聊天。也就是该功能没有实现离线聊天并存储纪律。
只有三台电脑中三个好友几乎等待彼此同时上线才开始聊天,此时三人可以彼此两两互相聊,若中途有人下线再上线,则其余两人可能默认为该好友仍然离线,无法聊天。
通话原理:
ip地址有两种ip地址:无线ip和本地ip
我的电脑,以太网适配器 本地连接:。有线网ip地址是:203.117.137.193(首选)(假如)
无线局域网的ip地址是:192.168.191.1(首选)(必须开启猎豹wifi才有此地址)
对于tcp通信:
服务端有个socket,在服务器的socket里填入服务器软件所在电脑ip地址。最好是本地ip地址(也可以是入服务器软件所在电脑的无线ip地址),端口号可以任意设置。输好以后,然后开启服务供多个客户端连接。
然后多个客户端,都必须统一输入服务器里的ip地址和端口号(必须和服务器里的完全一致,注意不是客户端本机所在的ip地址而是服务器里设定的)。
服务端有个socket,在服务器的socket里填入服务器软件所在电脑ip地址。如果是服务器软件所在电脑的本地ip地址:则可以提供任一台机器间通话。
服务端有个socket,在服务器的socket里填入服务器软件所在电脑ip地址。如果是服务器软件所在电脑的无线ip地址:则只能提供与连接该电脑无线wifi的电脑进行通话。
服务器中只有这两种ip地址是有效的ip地址其余的ip地址一般会报:不可以监听。
tcp listen
服务器:
#include <QTcpServer>
#include <QTcpSocket>
tcpServer = new QTcpServer(this);
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnectSlot()));
if(tcpServer->listen(QHostAddress::Any, i)){ui->textEdit->append("listen OK!");}else{ui->textEdit->append("listen error!");}
void Servers_1::newConnectSlot(){QString tmp;QTcpSocket *tcp = tcpServer->nextPendingConnection();connect(tcp,SIGNAL(readyRead()),this,SLOT(readMessage()));userList << tcp;tmp.append(tcp->peerAddress().toString());
tmp.append("上线了!");ui->textEdit->append(tmp);connect(tcp,SIGNAL(disconnected()),this,SLOT(removeUserFormList()));}//等待用户消息;
void Servers_1::readMessage(){QByteArray tmp;QString bb;QTcpSocket *socket = static_cast<QTcpSocket*>(sender());//qDebug() << socket->readAll();tmp.append(socket->readAll());
if(tmp[0] == '%'){QString tmptmp(tmp);ipname = tmptmp.split("%");ips.append(ipname.at(1));ips.append("^");names.append(ipname.at(2));names.append("^");ipss = ips.split("^");namess = names.split("^");list();
}else{for(int i = 0; i < userList.count(); i++){
userList.at(i)->write(tmp);}
}
}QString Servers_1::getIP() //获取ip地址{QList<QHostAddress> list = QNetworkInterface::allAddresses();foreach (QHostAddress address, list){if(address.protocol() == QAbstractSocket::IPv4Protocol){if (address.toString().contains("127.0.")){continue;}
return address.toString();}
}
return 0;}void Servers_1::on_pushButton_clicked() //开启服务器;{init();
}void Servers_1::removeUserFormList(){QString tmp;QTcpSocket* socket = static_cast<QTcpSocket*>(sender());// QTcpSocket *tcp = tcpServer->nextPendingConnection();
socket->peerAddress().toString();
if(userList.removeOne(socket)){tmp.append(socket->peerAddress().toString());
tmp.append("下线了!");ui->textEdit->append(tmp);list();
}
}void Servers_1::on_pushButton_2_clicked(){ui->textEdit->clear();}void Servers_1::list(){QByteArray msg;QString aa;for(int i = 0; i < userList.count() && userList.at(i)->peerAddress().toString() != aa; i++){msg.append( userList.at(i)->peerAddress().toString());for(int k = 0; k <ipss.count(); k++){if( userList.at(i)->peerAddress().toString()== ipss.at(k)){msg.append("\n");msg.append(namess.at(k));break;}
}
msg.append(" @");aa = userList.at(i)->peerAddress().toString();}
for(int j = 0; j <userList.count(); j++){userList.at(j)->write(msg);}
msg.clear();
}
http://blog.csdn.net/pk124729136/article/details/8087609
http://blog.sina.com.cn/s/blog_4bdbec750100mxhv.html
这篇关于扣扣2013 解析和问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!