一个Websocket服务器,我本地用web+js连接不中断,用c#连接固定90秒就断

中文命名法 2018-05-31 05:14:44
C#代码的客户端,连接,发送,接受,ping,pong都很正常,但是每次从连接开始90秒服务器就自动断开我。
不怀疑本地代码问题,因为相通代码连接其他平台的websocket完全正常。我比较怀疑这个主动断开我的服务器配置问题。抓了点包,大家帮我分析看看。是哪里不对?
用web+js方式连接它,不断,C# 连接就断。

JS方式请求包
GET wss://ws.gateio.io/v3 HTTP/1.1
Host: ws.gateio.io
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: https://gateio.io
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36 Maxthon/5.2.3.500
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN
Cookie: Hm_lvt_0a1ead8031fdf1a7228954da1b158d36=1527672527,1527728983,1527749240,1527756570; Hm_lpvt_0a1ead8031fdf1a7228954da1b158d36=1527756578
Sec-WebSocket-Key: Nh3D9boFt7HD4Q5LosloGg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
JS方式响应包
HTTP/1.1 101 Switching Protocols
Server: openresty/1.13.6.1
Date: Thu, 31 May 2018 08:49:51 GMT
Content-Length: 0
Connection: upgrade
Sec-WebSocket-Accept: 2ylEi6aqI8XJwxifJJP+u9fixec=
Upgrade: websocket


C#方式请求包
GET /v3 HTTP/1.1
Connection: Upgrade,Keep-Alive
Upgrade: websocket
Sec-WebSocket-Key: 6ZDQpvyK2IVCosCsPSYh2w==
Sec-WebSocket-Version: 13
Host: ws.gateio.io
C#方式响应包
HTTP/1.1 101 Switching Protocols
Server: openresty/1.13.6.1
Date: Thu, 31 May 2018 08:56:34 GMT
Connection: upgrade
Sec-WebSocket-Accept: 9Q380nJ/uS8LzIAVcKHNfBf0szg=
Upgrade: websocket
Content-Length: 0
...全文
1469 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulilittle 2018-06-06
  • 打赏
  • 举报
回复
它大概为以下几类问题: ------------------ ws协议问题: 有些ws服务器与客户端并不接受,不满足自身要求的协议时会主动的abort断开连接;这例如:IE要求服务器upgrade相应必须具有“Sec-WebSocket-Location、Sec-WebSocket-Accept、Sec-WebSocket-Origin”才可以,而IE与firebox之间也有一些小差异但只要不去涉及几乎不对ws服务器网路底层有多少影响。(解决办法:修正协议) ws第三方库问题: 诸如:github上开源的“websocket-sharp”与“SuperWebSocket”都很不稳定,当一个ws链接成功建立accept以后,等一会这个链接无论发 送任何消息到服务器,服务器都不具有任何响应,客户端无限被pending被timeout。(解决方法:1、修改它的源代码,2、重写开发新的框架,3、寻找稳定可靠的) 缺失心跳包: ws客户端不会主动向服务器发送任何消息;而ws协议是基于TCP,而TCP是具有默认值的当多少时间以内 client -socket and server-socket之间没有任何“payload”通过 双方会自动关闭链接。(解决办法:建立心跳包) 主动关闭: 客户端或服务器主动的关闭链接。(解决办法:排查关闭原因按需调整源)
中文命名法 2018-06-05
  • 打赏
  • 举报
回复
引用 8 楼 sxl514286339 的回复:
好吧,我看了一下具体网址 —— 似乎又不是我说的这个。
引用 10 楼 lmt5408 的回复:
之前我给客户开发消息推送功能的时候碰到过类似问题,长连接的情况下,每到60s就会自动断掉,断了后重连都连不上。后来定位了半天发现是客户端访问服务器的时候会经过客户的网关,他们网关有做过处理,链接时长超过60s的就自动踢掉,不管是否活动状态。建议你排查下是不是网络问题
但是难以解释,为什么客户端如果使用web+javascript就不会90秒断线的问题啊。
lmt5408 2018-06-02
  • 打赏
  • 举报
回复
之前我给客户开发消息推送功能的时候碰到过类似问题,长连接的情况下,每到60s就会自动断掉,断了后重连都连不上。后来定位了半天发现是客户端访问服务器的时候会经过客户的网关,他们网关有做过处理,链接时长超过60s的就自动踢掉,不管是否活动状态。建议你排查下是不是网络问题
吹风的兔子 2018-06-02
  • 打赏
  • 举报
回复
吹风的兔子 2018-06-02
  • 打赏
  • 举报
回复
好吧,我看了一下具体网址 —— 似乎又不是我说的这个。
吹风的兔子 2018-06-02
  • 打赏
  • 举报
回复
HttpWebRequest.Timeout 属性没有设置 或者 设置的就是90秒 ?
中文命名法 2018-06-01
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
可能是此服务端定时验证了某个认证信息,而你却忽略的他
我百度了很多内容,有帖子说因为web和原生传过去的协议是不一样的,web传过去是null,原生传过去default-protocol。请问能否分析出这里的区别,修改客户端配置?
xuzuning 2018-06-01
  • 打赏
  • 举报
回复
没有看到两端的代码,无法知道都做了些什么 可能是此服务端定时验证了某个认证信息,而你却忽略的他
中文命名法 2018-06-01
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
显然是你的 C# 代码有问题,服务端并不知道(也没有必要知道)请求来自何种语言的程序,更不会歧视 C#
我一开始也是这么以为的。但是这种假设解释不了以下这2个问题: 第一,相通的C#代码连接其他交易平台的ws服务器,毫无问题; 第二,连接这个问题服务器,一开始也都是正常的,包括连接,发送,接受,ping,pong。但是一到90秒,就断。 所以,问题就是C#和javascript对于ws的处理哪里有不同?
xuzuning 2018-06-01
  • 打赏
  • 举报
回复
显然是你的 C# 代码有问题,服务端并不知道(也没有必要知道)请求来自何种语言的程序,更不会歧视 C#
中文命名法 2018-06-01
  • 打赏
  • 举报
回复
引用 1 楼 qq_17486399 的回复:
我们公司的socket 都有踢掉机制,只要是无所作为的连接就会在踢掉,不知道 你连的这个服务器是不是这个原因
一直有动作,并且javascript连接就不断,C#连接后90秒必断。
大鱼> 2018-05-31
  • 打赏
  • 举报
回复
我们公司的socket 都有踢掉机制,只要是无所作为的连接就会在踢掉,不知道 你连的这个服务器是不是这个原因

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧