IE8/9原生是不支持WebSocket的,但是我们可以使用flash去模拟一个WebSocket接口出来。

这方面,https://github.com/gimite/web-socket-js 已经可以使用。

除了客户端之外,服务端需要做个flash安全策略设置。

这里的服务端是指WebSocet服务器所在的服务端。默认端口是843端口。

客户端使用flash模拟WebSocket时,会打开一个到服务端843端口的TCP链接。

并且发送数据:

  1. <policy-file-request>.

服务端需要回应下面类似的内容

  1. <?xml version="1.0"?>
  2. <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
  3. <cross-domain-policy>
  4. <site-control permitted-cross-domain-policies="all"/>
  5. <allow-access-from domain="*" to-ports="*" secure="false"/>
  6. <allow-http-request-headers-from domain="*" headers="*"/>
  7. </cross-domain-policy>

Node.js实现

  • policy.js

    1. module.exports.policyFile =
    2. `<?xml version="1.0"?>
    3. <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
    4. <cross-domain-policy>
    5. <site-control permitted-cross-domain-policies="all"/>
    6. <allow-access-from domain="*" to-ports="*" secure="false"/>
    7. <allow-http-request-headers-from domain="*" headers="*"/>
    8. </cross-domain-policy>`
  • index.js

  1. const Net = require('net')
  2. const {policyFile} = require('./policy')
  3. const port = 843
  4. console.log(policyFile)
  5. const server = new Net.Server()
  6. server.listen(port, function() {
  7. console.log(`Server listening for connection requests on socket localhost:${port}`);
  8. });
  9. server.on('connection', function(socket) {
  10. console.log('A new connection has been established.');
  11. socket.end(policyFile)
  12. socket.on('data', function(chunk) {
  13. console.log(`Data received from client: ${chunk.toString()}`);
  14. });
  15. socket.on('end', function() {
  16. console.log('Closing connection with the client');
  17. });
  18. socket.on('error', function(err) {
  19. console.log(`Error: ${err}`);
  20. });
  21. });