如何在WebSocket的服务器侧检测客户端的断开连接

如何在WebSocket的服务器侧检测客户端的断开连接,第1张

我用chrome启动websocket,用c#写服务器
能够建立链接(handshake),可是chrome的websocket在发送信息4次之后 ,会主动关闭链接。这里检查过不是服务器主动关闭,服务器没有异常。
服务器的逻辑也很简单,当建立了handshake之后,服务器不做任何 *** 作,仅仅接受客户端发送的信息。
服务器使用了异步模型,这个和网上的代码也差不多。
而且每次都是4次之后浏览器主动关闭websocket

# coding:utf-8
import os
import struct
import base64
import hashlib
import socket
import threading
import paramiko
def get_ssh(ip, user, pwd):
try:
ssh = paramikoSSHClient()
sshset_missing_host_key_policy(paramikoAutoAddPolicy())
sshconnect(ip, 22, user, pwd, timeout=15)
return ssh
except Exception, e:
print e
return "False"
def recv_data(conn): # 服务器解析浏览器发送的信息
try:
all_data = connrecv(1024)
if not len(all_data):
return False
except:
pass
else:
code_len = ord(all_data[1]) & 127
if code_len == 126:
masks = all_data[4:8]
data = all_data[8:]
elif code_len == 127:
masks = all_data[10:14]
data = all_data[14:]
else:
masks = all_data[2:6]
data = all_data[6:]
raw_str = ""
i = 0
for d in data:
raw_str += chr(ord(d) ^ ord(masks[i % 4]))
i += 1
return raw_str
def send_data(conn, data): # 服务器处理发送给浏览器的信息
if data:
data = str(data)
else:
return False
token = "\x81"
length = len(data)
if length < 126:
token += structpack("B", length) # struct为Python中处理二进制数的模块,二进制流为C,或网络流的形式。
elif length <= 0xFFFF:
token += structpack("!BH", 126, length)
else:
token += structpack("!BQ", 127, length)
data = '%s%s' % (token, data)
connsend(data)
return True
def handshake(conn, address, thread_name):
headers = {}
shake = connrecv(1024)
if not len(shake):
return False
print ('%s : Socket start handshaken with %s:%s' % (thread_name, address[0], address[1]))
header, data = shakesplit('\r\n\r\n', 1)
for line in headersplit('\r\n')[1:]:
key, value = linesplit(': ', 1)
headers[key] = value
if 'Sec-WebSocket-Key' not in headers:
print ('%s : This socket is not websocket, client close' % thread_name)
connclose()
return False
MAGIC_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
HANDSHAKE_STRING = ">有可能是服务器PC,IP地址更改。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输 。
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。

踩着年末的尾巴,提前布局来年,为来年的工作做个好的铺垫,所以就开始了面试历程,因为项目中使用到了 WebSocket ,面试官在深挖项目经验的时候,也难免提到 WebSocket 相关的知识点,因为之前并没有考虑这么深,所以,回答的还是有所欠缺,因此,赶紧趁热再熟悉熟悉,也借此机会,整理出来供大家咀嚼,每个项目都有其值得挖掘的闪光点,要用有爱的眼睛去发现。

WebSocket 是一种在单个TCP连接上进行全双工通信的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。(维基百科)

WebSocket 本质上一种计算机网络应用层的协议,用来弥补 >在浏览器与服务器通信间,传统的 >

>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13216028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存