第一次看到websocket这个词时很难想到它竟然会是一种协议。据说是一种全双工通讯协议,服务器也可以主动向客户端发送数据,解决了Http协议一问一答式带来的效率问题。不过这不是本文关注的重点,这里关心的是利用webscoket可以实现网页与Qt写的服务端通信。
Qt对websocket的封装分为服务端和客户端,分别使用QWebSocketServer和QWebSocket。以服务端为例写个最简单例子:
1.要使用websocket需要在pro文件中加上 QT = websockets。
2.创建QWebSocketServer实例并连接它的newconnection()信号。
//QWebSocketServer* m_pServer; --成员变量 m_pServer = new QWebSocketServer(QStringLiteral("Hello fearlazy"),QWebSocketServer::NonSecureMode); connect(m_pServer,SIGNAL(newConnection()),this,SLOT(slotNewConnection()));
在newConnection()连接的槽函数中获得连接的客户端websocket,并通过websocket发送消息给客户端。
void CServer::slotNewConnection() { QWebSocket* pSocket = m_pServer->nextPendingConnection(); pSocket->sendTextMessage(QStringLiteral("你好, fearlazy!")); }
3.开启监听
m_pServer->listen(QHostAddress::Any,3333);
至此服务端就写好了,完成的功能就是当客户端连接时,发送消息“你好,fearlazy!”给客户端。
接下来需要写一个网页来验证一下,该网页上有一个button用来连接服务端,一个textarea用来显示收到的服务端的消息,源码如下:
<html> <head> <title>web socket client</title> </head> <body> <button onClick="connect();">Connect</button> <textarea id="msgArea"></textarea> <script type="text/javascript"> var wsuri = "ws://localhost:3333"; var websocket = null; var msgArea = document.getElementById("msgArea"); function connect(){ try{ websocket = new WebSocket(wsuri); websocket.onopen = function(evt){ msgArea.value = "connected\n"; }; websocket.onmessage = function(evt){ msgArea.value = evt.data; msgArea.value = "\n"; }; }catch(execption){ msgArea.value = "error"; } } </script> </body> </html>
当按下按钮时调用connect()函数,在这个函数中我们创建了websocket对象并写了它的onopen和onmessage函数。在onmessage函数里会收到服务端发过来的数据,我们将收到的消息直接放到textarea里显示出来。
最后测试一下:先打开服务端程序,然后用谷歌浏览器打开html并点击Connect按钮.(谷歌浏览器默认支持websocket)。可以看到服务端发回来的消息“你好,fearlazy!”。完美,妈妈再也不用担心我们和web程序员打交道了!
说明:Qt websocket在5.3版本中引入。