Signalr核心客户端
链接
-
开发到具有图书馆示例和实施的帖子
-
PYPI
-
Wiki-这个文档
发展
测试服务器将在此处可用,需要Docker组合。
signalrcore–containertestservers
docker compose up
cd ../ signalrcore
make tests\”>
git clone https://*github*.c*om/mandrewcito/signalrcore-containertestservers cd signalrcore -containertestservers docker compose up cd ../ signalrcore make tests
一个小小的
连接到没有auth的服务器
hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url )\\ . configure_logging ( logging . DEBUG )\\ . with_automatic_reconnect ({ \"type\" : \"raw\" , \"keep_alive_interval\" : 10 , \"reconnect_interval\" : 5 , \"max_attempts\" : 5 }). build ()
使用auth连接到服务器
login_function必须提供验证令牌
hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url , options = { \"access_token_factory\" : login_function , \"headers\" : { \"mycustomheader\" : \"mycustomheadervalue\" } })\\ . configure_logging ( logging . DEBUG )\\ . with_automatic_reconnect ({ \"type\" : \"raw\" , \"keep_alive_interval\" : 10 , \"reconnect_interval\" : 5 , \"max_attempts\" : 5 }). build ()
未经授权的错误
如果授权失败,则登录功能必须提供错误控制器。当连接启动时,如果授权失败失败,例外将被传播。
def login ( self ): response = requests . post ( self . login_url , json = { \"username\" : self . email , \"password\" : self . password }, verify = False ) if response . status_code == 200 : return response . json ()[ \"token\" ] raise requests . exceptions . ConnectionError () hub_connection . start () # this code will raise requests.exceptions.ConnectionError() if auth fails
配置记录
HubConnectionBuilder ()\\ . with_url ( server_url , . configure_logging ( logging . DEBUG ) ...
配置套接字跟踪
HubConnectionBuilder ()\\ . with_url ( server_url , . configure_logging ( logging . DEBUG , socket_trace = True ) ...
配置自己的处理程序
import logging handler = logging . StreamHandler () handler . setLevel ( logging . DEBUG ) hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url , options = { \"verify_ssl\" : False }) \\ . configure_logging ( logging . DEBUG , socket_trace = True , handler = handler ) ...
配置重新连接
到达Max_Attempt后,将抛出一项爆炸事件,并将解雇on_disconnect事件。
hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url )\\ ... . build ()
配置其他标题
hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url , options = { \"headers\" : { \"mycustomheader\" : \"mycustomheadervalue\" } }) ... . build ()
配置其他Querystring参数
server_url = \"http.... /?myquerystringparam=134&foo=bar\" connection = HubConnectionBuilder ()\\ . with_url ( server_url , options = { })\\ . build ()
配置跳过谈判
hub_connection = HubConnectionBuilder () \\ . with_url ( \"ws://\" + server_url , options = { \"verify_ssl\" : False , \"skip_negotiation\" : False , \"headers\" : { } }) \\ . configure_logging ( logging . DEBUG , socket_trace = True , handler = handler ) \\ . build ()
配置ping(保持生命)
keep_alive_interval设置ping消息的秒
hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url )\\ . configure_logging ( logging . DEBUG )\\ . with_automatic_reconnect ({ \"type\" : \"raw\" , \"keep_alive_interval\" : 10 , \"reconnect_interval\" : 5 , \"max_attempts\" : 5 }). build ()
配置记录
hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url )\\ . configure_logging ( logging . DEBUG )\\ . with_automatic_reconnect ({ \"type\" : \"raw\" , \"keep_alive_interval\" : 10 , \"reconnect_interval\" : 5 , \"max_attempts\" : 5 }). build ()
配置MessagePack
signalrcore.protocol.messagepack_protocol import MessagePackHubProtocol
HubConnectionBuilder()\\
.with_url(self.server_url, options={\”verify_ssl\”:False})\\
…
.with_hub_protocol(MessagePackHubProtocol())\\
…
.build()\”>
from signalrcore . protocol . messagepack_protocol import MessagePackHubProtocol HubConnectionBuilder ()\\ . with_url ( self . server_url , options = { \"verify_ssl\" : False })\\ ... . with_hub_protocol ( MessagePackHubProtocol ())\\ ... . build ()
事件
连接 /断开连接
ON_OPEN-打开连接并准备好发送消息on_close -fire -ne_close -fire -dife ot on_close-开火 – 连接关闭时,开火
hub_connection . on_open ( lambda : print ( \"connection opened and handshake received ready to send messages\" )) hub_connection . on_close ( lambda : print ( \"connection closed\" ))
关于集线器错误(集线器异常…)
hub_connection.on_error(lambda data: print(f\"An exception was thrown closed{data.error}\"))
注册操作
ackivemessage-信号方法打印 – 具有signalr方法的参数arg的函数
hub_connection . on ( \"ReceiveMessage\" , print )
发送消息
sendMessage-信号方法用户名,消息 – 信号索的参数
hub_connection . send ( \"SendMessage\" , [ username , message ])
发送回调的消息
sendMessage-信号方法用户名,消息 – 信号索的参数
send_callback_received = threading . Lock () send_callback_received . acquire () self . connection . send ( \"SendMessage\" , # Method [ self . username , self . message ], # Params lambda m : send_callback_received . release ()) # Callback if not send_callback_received . acquire ( timeout = 1 ): raise ValueError ( \"CALLBACK NOT RECEIVED\" )
请求流媒体(服务器到客户端)
hub_connection . stream ( \"Counter\" , [ len ( self . items ), 500 ]). subscribe ({ \"next\" : self . on_next , \"complete\" : self . on_complete , \"error\" : self . on_error })
客户端流
signalrcore.subject import Subject
subject = Subject()
# Start Streaming
hub_connection.send(\”UploadStream\”, subject)
# Each iteration
subject.next(str(iteration))
# End streaming
subject.complete()\”>
from signalrcore . subject import Subject subject = Subject () # Start Streaming hub_connection . send ( \"UploadStream\" , subject ) # Each iteration subject . next ( str ( iteration )) # End streaming subject . complete ()
完整的例子
示例将是可以使用Aspnet Core -signalrchat的软件包开发的。
聊天示例
迷你示例可能是这样的:
signalrcore.hub_connection_builder import HubConnectionBuilder
def input_with_default(input_text, default_value):
value = input(input_text.format(default_value))
return default_value if value is None or value.strip() == \”\” else value
server_url = input_with_default(\’Enter your server url(default: {0}): \’, \”wss://localhost:44376/chatHub\”)
username = input_with_default(\’Enter your username (default: {0}): \’, \”mandrewcito\”)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
hub_connection = HubConnectionBuilder()\\
.with_url(server_url, options={\”verify_ssl\”: False}) \\
.configure_logging(logging.DEBUG, socket_trace=True, handler=handler) \\
.with_automatic_reconnect({
\”type\”: \”interval\”,
\”keep_alive_interval\”: 10,
\”intervals\”: [1, 3, 5, 6, 7, 87, 3]
}).build()
hub_connection.on_open(lambda: print(\”connection opened and handshake received ready to send messages\”))
hub_connection.on_close(lambda: print(\”connection closed\”))
hub_connection.on(\”ReceiveMessage\”, print)
hub_connection.start()
message = None
# Do login
while message != \”exit()\”:
message = input(\”>> \”)
if message is not None and message != \”\” and message != \”exit()\”:
hub_connection.send(\”SendMessage\”, [username, message])
hub_connection.stop()
sys.exit(0)
\”>
import logging import sys from signalrcore . hub_connection_builder import HubConnectionBuilder def input_with_default ( input_text , default_value ): value = input ( input_text . format ( default_value )) return default_value if value is None or value . strip () == \"\" else value server_url = input_with_default ( \'Enter your server url(default: {0}): \' , \"wss://localhost:44376/chatHub\" ) username = input_with_default ( \'Enter your username (default: {0}): \' , \"mandrewcito\" ) handler = logging . StreamHandler () handler . setLevel ( logging . DEBUG ) hub_connection = HubConnectionBuilder ()\\ . with_url ( server_url , options = { \"verify_ssl\" : False }) \\ . configure_logging ( logging . DEBUG , socket_trace = True , handler = handler ) \\ . with_automatic_reconnect ({ \"type\" : \"interval\" , \"keep_alive_interval\" : 10 , \"intervals\" : [ 1 , 3 , 5 , 6 , 7 , 87 , 3 ] }). build () hub_connection . on_open ( lambda : print ( \"connection opened and handshake received ready to send messages\" )) hub_connection . on_close ( lambda : print ( \"connection closed\" )) hub_connection . on ( \"ReceiveMessage\" , print ) hub_connection . start () message = None # Do login while message != \"exit()\" : message = input ( \">> \" ) if message is not None and message != \"\" and message != \"exit()\" : hub_connection . send ( \"SendMessage\" , [ username , message ]) hub_connection . stop () sys . exit ( 0 )
