-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwss.cpp
154 lines (150 loc) · 5.12 KB
/
wss.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "wss.h"
wss::wss()
{
}
wss::~wss()
{
server->close();
if(server)delete server;
qDebug()<<"wss"<<port<<"isclose";
}
bool wss::init(uint16_t port)
{
this->port=port;
server = new QWebSocketServer("server",QWebSocketServer::NonSecureMode,this);
if(server->listen(QHostAddress::Any, port))
{
qDebug()<<"listening port="+QString::number(port);
connect(server,SIGNAL(newConnection()),
this, SLOT(onNewConnection()));
}else{
qDebug()<<"wss init fail";
return false;
}
return true;
}
void wss::onNewConnection()//新链接
{
//if(鉴权通过){
QWebSocket * pWebSocket(this->server->nextPendingConnection());
//}else{
//this->server->nextPendingConnection()->abort();
//return;
//}
QString key=QString("%1-%2")
.arg(pWebSocket->peerAddress().toString())
.arg(pWebSocket->peerPort());
connect(pWebSocket,&QWebSocket::textMessageReceived,
this, &wss::processTextMessage);
connect(pWebSocket, &QWebSocket::binaryMessageReceived,
this, &wss::processBinauyMessage);
connect(pWebSocket,&QWebSocket::disconnected,
this, &wss::socketDisconnected);
qDebug()<<"newConnection"<<QString("%1-%2")
.arg(pWebSocket->peerAddress().toString())
.arg(pWebSocket->peerPort());
hashIpPort2PWebSocket.insert(key,pWebSocket);
qDebug()<<hashIpPort2PWebSocket.size();
emit signal_newConnection(pWebSocket->peerAddress().toString(),pWebSocket->peerPort(),pWebSocket->requestUrl());
}
void wss::processTextMessage(const QString & msg)//收到文字数据
{
QWebSocket *pWebSocket = dynamic_cast<QWebSocket *>(sender());
if(!pWebSocket)
{
return;
}
qDebug().noquote()<<"new Text msg:"<<pWebSocket->peerAddress().toString()
<<pWebSocket->peerPort()
<<msg;
if(msg=="PING")
{
this->slot_sendText(pWebSocket->peerAddress().toString(),pWebSocket->peerPort(),"PONG");
}else{
emit signal_processTextMessage(pWebSocket->peerAddress().toString()
,pWebSocket->peerPort()
,msg);
}
//复读机
// QString rmsg="rap"+msg;
// this->slot_sendText(pWebSocket->peerAddress().toString()
// ,pWebSocket->peerPort()
// ,rmsg);
}
void wss::processBinauyMessage(const QByteArray & msg)//收到二进制数据
{
QWebSocket *pWebSocket = dynamic_cast<QWebSocket *>(sender());
if(!pWebSocket)
{
return;
}
//qDebug()<<"new binauy msg:"<<pWebSocket->peerAddress().toString()
// <<pWebSocket->peerPort();
// <<msg;
//复读机
// QByteArray rmsg=msg;
// this->slot_sendData(pWebSocket->peerAddress().toString()
// ,pWebSocket->peerPort()
// ,msg);
emit signal_processBinauyMessage(pWebSocket->peerAddress().toString()
,pWebSocket->peerPort()
,msg);
}
int wss::slot_sendText(QString ip, quint16 port, QString msg)
{
//qDebug()<<"sendText"<<QString("%1-%2").arg(ip).arg(port)<<msg;
QString key = QString("%1-%2").arg(ip).arg(port);
if(hashIpPort2PWebSocket.contains(key))
{
qint64 size=hashIpPort2PWebSocket.value(key)->sendTextMessage(msg);
//qDebug()<<"发送了"<<size<<"大小的数据";
return 0;
}else{
qDebug()<<"rep text fail";
}
return -1;
}
int wss::slot_sendData(QString ip, quint16 port, QByteArray msg)
{
//qDebug()<<"sendData"<<QString("%1-%2").arg(ip).arg(port);//<<msg;
QString key = QString("%1-%2").arg(ip).arg(port);
if(hashIpPort2PWebSocket.contains(key))
{
qint64 size=hashIpPort2PWebSocket.value(key)->sendBinaryMessage(msg);
//qDebug()<<"发送了"<<size<<"大小的数据到"<<ip+"-"+port;
return 0;
}else{
qDebug()<<"rep binary fail";
}
return -1;
}
int wss::slot_discennect(QString ip, quint16 port)
{
QString key = QString("%1-%2").arg(ip).arg(port);
if(hashIpPort2PWebSocket.contains(key))
{
hashIpPort2PWebSocket.value(key)->close();
return 0;
}else{
return -1;
}
}
void wss::socketDisconnected()//有个链接被关闭
{
QWebSocket *pWebSocket = dynamic_cast<QWebSocket *>(sender());
if(!pWebSocket)
{
return;
}
qDebug()<<"Disconnected:"
<<pWebSocket->peerAddress().toString()+"-"+QString::number(pWebSocket->peerPort())
<<pWebSocket->peerName();
pWebSocket->close();
hashIpPort2PWebSocket.remove(QString("%1-%2")
.arg(pWebSocket->peerAddress().toString())
.arg(QString::number(pWebSocket->peerPort()))
);
qDebug()<<hashIpPort2PWebSocket.size();
emit signal_pDiscennect(pWebSocket->peerAddress().toString()
,pWebSocket->peerPort());
}