Qt封装的websocket了解一下

    第一次看到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程序员打交道了!

blob.png


说明:Qt websocket在5.3版本中引入。


演示站
上一篇:Qt多个信号连接同一个槽的方法
下一篇:QUdpSocket初次见面多多关照

发表评论