【问题标题】:Negotiating a WebSocket in C# (Chrome connecting to Unity C# TCP Client)在 C# 中协商 WebSocket(Chrome 连接到 Unity C# TCP 客户端)
【发布时间】:2011-11-03 05:38:27
【问题描述】:

我一直在尝试设置一个 Unity3D 组​​件,该组件与 Javascript 客户端协商 WebSocket 连接。

我有一个线程化的 TCPListener (c#),它处理 HTTP 请求并尝试协商握手,尽管它似乎默默地失败了。客户端在我发送响应后不久关闭连接。

我一直按照这个网站上的说明进行操作:http://deusty.blogspot.com/2010/09/websocket-draft-76-algorithm-example.html

这是套接字日志

ws://localhost:3000/serverStart

Start Time: Wed Aug 24 2011 23:32:54 GMT+0100 (GMT Daylight Time)

t=1314225174926 [st=   0] +REQUEST_ALIVE             [dt=1038]
t=1314225174926 [st=   0]    +SOCKET_STREAM_CONNECT  [dt= 999]
                          --> url = "ws://localhost:3000/serverStart"
t=1314225174927 [st=   1]       +PROXY_SERVICE       [dt=   0]
t=1314225174927 [st=   1]           PROXY_SERVICE_RESOLVED_PROXY_LIST  
                                --> pac_string = "DIRECT"
t=1314225174927 [st=   1]       -PROXY_SERVICE       
t=1314225174927 [st=   1]       +PROXY_SERVICE       [dt=   0]
t=1314225174927 [st=   1]           PROXY_SERVICE_RESOLVED_PROXY_LIST  
                                --> pac_string = "DIRECT"
t=1314225174927 [st=   1]       -PROXY_SERVICE       
t=1314225174927 [st=   1]        HOST_RESOLVER_IMPL  [dt=   2]
                             --> source_dependency = {"id":455371,"type":7}
t=1314225175925 [st= 999]    -SOCKET_STREAM_CONNECT  
t=1314225175926 [st=1000]     WEB_SOCKET_SEND_REQUEST_HEADERS  
                          --> GET /serverStart HTTP/1.1
                              Upgrade: WebSocket
                              Connection: Upgrade
                              Host: localhost:3000
                              Origin: null     
                              Sec-WebSocket-Key1: 52 18  5w7 9       9 2c
                              Sec-WebSocket-Key2: a2PA tG8 1>7242<6(yj7I2

                              \x78\x15\xbc\x75\x2d\x54\x3b\xea
t=1314225175926 [st=1000]     SOCKET_STREAM_SENT     
t=1314225175963 [st=1037]     SOCKET_STREAM_RECEIVED  
t=1314225175963 [st=1037]     WEB_SOCKET_READ_RESPONSE_HEADERS  
                          --> HTTP/1.1 101 WebSocket Protocol Handshake
                              Upgrade: WebSocket
                              Connection: Upgrade
                              Sec-WebSocket-Origin: null
                              Sec-WebSocket-Location: ws://localhost:3000/serverStart
                              Sec-WebSocket-Protocol: webpad

                               \x20\xc3\xc3\xf6\xad\xd2\x76\x63\x48\x86\x0c\xd2\xa6\xb1\x06\x72
t=1314225175963 [st=1037]     SOCKET_STREAM_RECEIVED  
t=1314225175963 [st=1037]     SOCKET_STREAM_RECEIVED  
t=1314225175964 [st=1038] -REQUEST_ALIVE             

我正在使用以下算法生成响应

response = MD5( bitpack(
             Key1(numbers only / num of spaces), 
             Key2(numbers only / num of spaces), 
             RequestBody))

您能提供任何帮助将不胜感激?

【问题讨论】:

  • websocket 协议仍在发展中,我怀疑该示例是针对“旧(er)”草案...也存在对浏览器版本的依赖性(因为不同的浏览器版本实现不同的草案版本)
  • 我很确定我有正确的规范版本,我正在处理 00 版本。使用 Chrome 13(14 将使用新规范一旦发布)
  • 如果您正在处理 00 那么这是错误的 / Chrome 13 实现 03 aka v76 - 请参阅 stackoverflow.com/questions/4878830/…
  • 对不起,我提到的文章似乎是 v76。似乎仍然找不到错误。我已经将它与有效响应进行了比较,我唯一能想到的是如果我的挑战响应无效但我遵循规范响应 = MD5(bitpack(Key1(仅数字/空格数), Key2(数字仅/空格数),RequestBody))

标签: c# javascript google-chrome websocket tcplistener


【解决方案1】:

我在 Freenode 的#WhatWG 频道上与一些人讨论了这个问题(所以我不能相信),我们想知道为什么来源为空。也许 Chrome 有一个安全实现,不允许来自空源的连接(例如使用 file:///)。

有人建议尝试 Opera 11.00 或更高版本,看看 Chrome 是否存在此处的错误或某些安全模型不允许这样做。

【讨论】:

    【解决方案2】:

    Opera 将(如果您在 opera:config 中启用 websockets)在错误控制台中记录拒绝连接的原因,这有助于调试问题所在(如果是挑战或拼写错误的标题或错误的来源等) .

    但我怀疑这里真正的问题是您正在从 file:/// 进行测试,而 Chrome 不喜欢这样。

    【讨论】:

    • 今晚去试试,如果它又是一个权限错误,这将是我第三次因为 Chrome 权限错误而失去几天的开发:'(
    猜你喜欢
    • 2015-10-04
    • 2019-06-18
    • 2022-01-16
    • 1970-01-01
    • 2016-04-22
    • 2016-09-15
    • 2017-11-23
    • 2022-07-11
    • 2015-08-21
    相关资源
    最近更新 更多