#include <QtGui>
#include <QtNetwork>
#include <QRegExp>
#include <QString>
#include <QTableView>
#include <QPlastiqueStyle>
#include <QCleanlooksStyle>
#include "daemon.h"
#include "ui_daemon.h"
#include "tcpsockserver.h"
#include "sqlitedb.h"
#include "mysqlquerymodel.h"
Daemon::Daemon(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Daemon)
{
ui->setupUi(this);
this->setWindowTitle("QQ");
ui->startListenButton->setText("开始监听");
ui->ipLineEdit->setEnabled(true);
ui->portLineEdit->setEnabled(true);
ip.clear();
port.clear();
db = new SqliteDB;
tableViewRefresh();
}
Daemon::~Daemon()
{
delete ui;
}
void Daemon::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void Daemon::tableViewRefresh()
{
db->connectDB();
this->myModel = new MySqlQueryModel;
this->myModel->setQuery(QObject::tr("select id, name, logstat from user order by logstat desc"));
myModel->setHeaderData(0, Qt::Horizontal, tr("QQ号"));
myModel->setHeaderData(1, Qt::Horizontal, tr("昵称"));
myModel->setHeaderData(2, Qt::Horizontal, tr("状态"));
ui->tableView->setModel(myModel);
ui->tableView->setColumnWidth(0, 71);
ui->tableView->setColumnWidth(1, 71);
ui->tableView->setColumnWidth(2, 71);
ui->tableView->show();
db->closeDB();
}
void Daemon::on_startListenButton_clicked()
{
ip.clear();
port.clear();
ip = ui->ipLineEdit->text().trimmed();
port = ui->portLineEdit->text().trimmed();
if ( "开始监听" == ui->startListenButton->text() )
{
//close listening
// server.close();
//QMessageBox::critical( NULL, tr("提示"), tr("2.") );
//udpSocket->close();
//use regular expression to verify input information
QRegExp rxIp("\\d+\\.\\d+\\.\\d+\\.\\d+");
QRegExp rxPort(("[1-9]\\d{3,4}"));
rxIp.setPatternSyntax(QRegExp::RegExp);
rxPort.setPatternSyntax(QRegExp::RegExp);
if ( !rxPort.exactMatch(port) || !rxIp.exactMatch(ip) )
{
QMessageBox::critical( NULL, tr("提示"), tr("请输入正确的IP和端口.") );
}
else
{
//Tells the server to listen for incoming connections on address address and port port
if ( !server.listen( QHostAddress(ip), (quint16)port.toUInt() ) )
{
QMessageBox::critical(NULL, tr("提示"), tr("TCP监听失败: %1.").arg(server.errorString() ) );
}
else
{
//When Tcp listen established, then start Udp bind.
udpSocket = new QUdpSocket(this);
if ( !udpSocket->bind(QHostAddress(ip), (quint16)port.toUInt()+1 ) )
{
QMessageBox::critical(NULL, tr("提示"), tr("UDP绑定失败: %1.").arg(udpSocket->errorString() ) );
}
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(on_read_Datagrams()));
ui->startListenButton->setText("断开监听");
ui->ipLineEdit->setEnabled(false);
ui->portLineEdit->setEnabled(false);
}
}
}
else if ( "断开监听" == ui->startListenButton->text() )
{
//close listening
server.close();
udpSocket->close();
ui->startListenButton->setText("开始监听");
ui->ipLineEdit->setEnabled(true);
ui->portLineEdit->setEnabled(true);
}
}
void Daemon::on_read_Datagrams()
{
//QMessageBox::critical(NULL, tr("提示"), tr("on_read_Datagrams.") );
while (udpSocket->hasPendingDatagrams())
{
QByteArray block;
block.resize(udpSocket->pendingDatagramSize());
if ( -1 == udpSocket->readDatagram(block.data(), block.size(), &senderIp, &senderPort))
continue;
processDatagram(block);
}
}
void Daemon::processDatagram(QByteArray block)
{
QDataStream in(&block,QIODevice::ReadOnly);
quint16 dataGramSize;
QString msgType;
in >> dataGramSize >> msgType;
/*变为手动刷新
if ( "MSG_CLIENT_REGISTER_SUCCESS" == msgType )
{
tableViewRefresh();
}
*/
if ( "MSG_CLIENT_NEW_CONN" == msgType )
{
QString id;
in >> id;
QString data ;
data = id;
if ( !id.isEmpty() )
{
tableViewRefresh();
}
db->getUserAllOnline();
QStringList idList = db->strListId;
QStringList nameList = db->strListName;
QString msgType = "MSG_ALL_USER_ONLINE";
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_6);
out << (quint16)0 << msgType << idList << nameList;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
if ( !udpSocket->writeDatagram(block.data(), block.size(), senderIp, this->senderPort) )
{
QMessageBox::critical(NULL, tr("提示"), tr("!udpSocket->writeDatagram.") );
}
msgType= "MSG_NEW_USER_LOGIN";
block.clear();
out.device()->seek(0);
db->getUserInfo(id);
ui->listWidget->addItem("["+data+"]" + "is online");
out << (quint16)0 << msgType << id << db->strListUser.at(2);
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
if ( !udpSocket->writeDatagram(block.data(), block.size(), QHostAddress("255.255.255.255"), this->senderPort) )
{
QMessageBox::critical(NULL, tr("提示"), tr("!udpSocket->writeDatagram.") );
}
}
if ( "MSG_USER_LOGOUT"==msgType )
{
QString id;
QString data ;
in >> id;
data = id;
if( id.isEmpty() )
{
;
}
else
{
db->updateUserLogStat(id,"0");
this->tableViewRefresh();
msgType= "MSG_CLIENT_LOGOUT";
block.clear();
QDataStream out(&block,QIODevice::WriteOnly);
out.device()->seek(0);
db->getUserInfo(id);
out << (quint16)0 << msgType << id << db->strListUser.at(2);
out.device()->seek(0);
ui->listWidget->addItem("["+data+"]" + "is offline");
out << (quint16)(block.size() - sizeof(quint16));
if ( !udpSocket->writeDatagram(block.data(), block.size(), QHostAddress("192.168.1.255"), 6666) )
{
QMessageBox::critical(NULL, tr("提示"), tr("!udpSocket->writeDatagram.") );
}
}
}
if( "MSG_CLIENT_CHAT" == msgType)
{
QString toid,fromId,fromName,toIp,buffer;
in >> fromId >> toid >> buffer;
db->getUserInfo(toid);
toIp=db->strListUser.at(4);//to HostAddress
db->getUserInfo(fromId);
fromName=db->strListUser.at(2);
QByteArray blockTosend;
QDataStream tosend(&blockTosend,QIODevice::WriteOnly);
QString mytype="MSG_CLIENT_CHAT";
tosend<< (quint16)0 << mytype << fromName << fromId << buffer;
tosend.device()->seek(0);
tosend << (quint16)(blockTosend.size() - sizeof(quint16));
if(!udpSocket->writeDatagram(blockTosend.data(), blockTosend.size(), QHostAddress(toIp),6666))
QMessageBox::warning(NULL,"message sending","error");
}
if (msgType == "MSG_USER_MODI")
{
QString id;
QString nickname2;
QString pwd2;
in >> id >> nickname2 >> pwd2;
db->updateUser(id, nickname2, pwd2);
this->tableViewRefresh();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt自定义专属QQ聊天程序例程
共219个文件
dll:62个
a:48个
h:17个
5星 · 超过95%的资源 需积分: 49 1.0w 下载量 129 浏览量
2011-08-03
00:14:58
上传
评论 174
收藏 19.47MB RAR 举报
温馨提示
Qt自定义专属QQ聊天程序例程 内含debug,release两个版本,本地无Qt库也可以运行体验。
资源推荐
资源详情
资源评论
收起资源包目录
Qt自定义专属QQ聊天程序例程 (219个子文件)
clientappv3.pro.user.1.3 11KB
ChatServ.pro.user.1.3 11KB
libqtwcodecsd4.a 2KB
libqjpcodecsd4.a 2KB
libqcncodecsd4.a 2KB
libqkrcodecsd4.a 2KB
libqtwcodecsd4.a 2KB
libqjpcodecsd4.a 2KB
libqcncodecsd4.a 2KB
libqkrcodecsd4.a 2KB
libqjpcodecs4.a 2KB
libqtwcodecs4.a 2KB
libqkrcodecs4.a 2KB
libqcncodecs4.a 2KB
libqsqlodbcd4.a 2KB
libqjpcodecs4.a 2KB
libqtwcodecs4.a 2KB
libqkrcodecs4.a 2KB
libqcncodecs4.a 2KB
libqsqlodbcd4.a 2KB
libqsqlodbc4.a 2KB
libqsqlited4.a 2KB
libqsqlodbc4.a 2KB
libqsqlited4.a 2KB
libqsqlite4.a 2KB
libqsqlite4.a 2KB
libqjpegd4.a 2KB
libqtiffd4.a 2KB
libqjpegd4.a 2KB
libqtiffd4.a 2KB
libqgifd4.a 2KB
libqtiff4.a 2KB
libqmngd4.a 2KB
libqicod4.a 2KB
libqjpeg4.a 2KB
libqsvgd4.a 2KB
libqgifd4.a 2KB
libqtiff4.a 2KB
libqmngd4.a 2KB
libqicod4.a 2KB
libqjpeg4.a 2KB
libqsvgd4.a 2KB
libqmng4.a 2KB
libqico4.a 2KB
libqsvg4.a 2KB
libqgif4.a 2KB
libqmng4.a 2KB
libqico4.a 2KB
libqsvg4.a 2KB
libqgif4.a 2KB
LoginPanel_LoginButton_background_foreground.bmp 2KB
LoginPanel_LoginButton_background_background.bmp 2KB
LoginPanel_LoginButton_pushedAction_sb1_background_T0.bmp 2KB
ChatServ 1.1MB
daemon.cpp 9KB
login.cpp 7KB
panel.cpp 6KB
tcpconthread.cpp 5KB
sqlitedb.cpp 5KB
regdialog.cpp 4KB
moc_tcpconthread.cpp 3KB
chatform.cpp 3KB
moc_daemon.cpp 3KB
moc_tcpsockserver.cpp 2KB
mysqlquerymodel.cpp 1KB
main.cpp 996B
tcpsockserver.cpp 938B
main.cpp 625B
findpwd.cpp 480B
Thumbs.db 41KB
Thumbs.db 24KB
Thumbs.db 14KB
chat.db 6KB
chat.db 6KB
chat.db 6KB
Makefile.Debug 15KB
Makefile.Debug 9KB
Makefile.Debug 9KB
object_script.2donkey.Debug 492B
object_script.ChatServ.Debug 246B
object_script.clientappv3.Debug 216B
QtGui4.dll 9.09MB
QtGui4.dll 9.09MB
QtCore4.dll 2.29MB
QtCore4.dll 2.29MB
qsqlited4.dll 1.65MB
qsqlited4.dll 1.65MB
qmngd4.dll 1.45MB
qmngd4.dll 1.45MB
qtiffd4.dll 1.3MB
qtiffd4.dll 1.3MB
qjpegd4.dll 1.27MB
qjpegd4.dll 1.27MB
QtNetwork4.dll 1.11MB
QtNetwork4.dll 1.11MB
qjpcodecsd4.dll 947KB
qjpcodecsd4.dll 947KB
qsqlodbcd4.dll 938KB
qsqlodbcd4.dll 938KB
qsvgd4.dll 679KB
共 219 条
- 1
- 2
- 3
念茜
- 粉丝: 1w+
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页