IE8的一些尝试
Websocket通信?
以上明确表示,IE8是不支持websocket的,但是已完成的应用,通信部分都是基于websocket,要兼容IE8,只能找其他模拟的办法。
在github上找了一些库,看到socket.io的1.3.7版本,还是支持在IE8上模拟websocket的。但是无法直接连接到实际的websocket后台服务,需要通过socket.io的服务端进行中转。在IE8上,socket.io用的是polling的方式,效率低了很多,完全不能用。
再找其他库,了解到可以使用flash进行socket通信:https://github.com/gimite/web-socket-js,这个库就是基于flash实现了websocket通信。一开始没有注意到socket policy file的概念,一直没有连接上服务器。然后打开843端口,用这个库里面提到的这个https://github.com/3rd-Eden/FlashPolicyFileServer,部署了一个基于nodejs的Policy Server,才可以连上服务器。
这里还有一点要注意,客户端网页的容器,必须在服务器上。
既然websocket是能通的,顺便就尝试了一下IE8下进行socket通信的方式,在github上找到了一些jssocket类似的库,能够建立socket连接,发送数据,然后自己主动断开了,或许是因为flash内部不是建立的长连接的缘故,或者有哪些参数没有设对。
OCX插件尝试
试过了通过flash实现网络通信,但是IE8还不支持canvas绘图,于是想到使用ocx插件,进行数据绘制。
按照网上通用方法创建工程,然后写demo测试,一般都不会有问题,有问题也是因为我自以为是,一上来就想传递char *之类的数据,导致demo一直跑不通。然后又创建工程,从最基本的项目开始测试。只添加一个方法,然后调用此方法后通过事件回调结果。在触发事件回调的时候,又导致IE8崩溃,检查之后,又是因为参数类型的问题。
这里还有一个问题,事件回调必须在主线程触发,否则是不能触发的。这就需要在通信线程中post一个message到控件,然后在主线程触发事件回调。这里在没有控件窗口的时候(只创建了一个控件),postmessage一直不成功,后来google查到,COleControl继承了CWnd,但并没有初始化m_hWnd,所以直接获取窗口句柄,都是NULL,需要在构造函数添加以下代码
m_hWnd = NULL;
if (!CreateEx(0, AfxRegisterWndClass(0), _T("My OCX Notification Sink"), WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
{
AfxThrowResourceException();
}
还有一些小细节,都是通过尝试,验证自己的一些想法。
- OCX消息映射那里,还是需要用ON_MESSAGE(WM_UPDATEDATA, &CMFCTestCtrl::OnUpdateData)
- 事件是事件,消息是消息,线程post的消息,进不到事件映射那里去的(看到网上一篇博客,被带进了沟里)
- OCX属性尽量不用吧,本来是想通过属性改变事件,做一些通知,但是IE8下,属性改变事件不触发,还会导致崩溃。
以上这些东西,估计以后都用不到。