当前位置:   article > 正文

python-socket、websocket协议相关知识_python websocket客户端

python websocket客户端

socket、websocket通信协议概念

socket通信

socket通信是基于TCP/IP协议,适用于传输大量数据和可靠的连接。它在网络编程中应用广泛,但不适用于实时性要求较高的场景。在Python中,socket和socketserver是两个用于网络编程的库。socket库提供了基本的网络通信功能,包括创建套接字、绑定地址、监听连接等。它主要用于实现客户端或服务器端的网络通信。使用socket库时,需要手动处理数据的发送和接收,以及错误处理等。socketserver库是基于socket库的一个扩展库,它提供了更高级的网络通信功能,如多线程、异步I/O等。它主要用于实现高性能的网络服务器。使用socketserver库时,可以更方便地处理多个客户端连接,以及并发请求等。

  • 如果只需要实现基本的客户端或服务器端网络通信,可以使用socket库。但如需要处理多个客户端连接或高性能的网络服务器,建议使用socketserver库。

websocket协议通信

WebSocket协议是一种基于TCP的网络通信协议,它允许在客户端和服务器之间进行全双工通信。WebSocket协议的握手过程需要进行HTTP握手。在Python中,websocket和websockets是两个用于实现WebSocket协议的库。它们提供了在客户端和服务器之间进行双向通信的功能。

  • websocket库是同步的,而websockets库是异步的。如果你需要处理大量的并发连接,那么websockets库可能会更适合,因为它不会阻塞主线程。
  • websockets库提供了更简洁的API,使得编写WebSocket服务器变得更加容易。但是,如果需要更多的控制和灵活性,那么websocket库可能会更适合。

代码案例

socket案例

server端

1. 通过socket模块创建server端

步骤:

1. 创建socket对象,s=socket.socket()

2. 绑定ip/端口地址,s.bind((ip,port)) #参数为元组

3. 监听端口,s.listen()

4. 开启循环,接受客户端连接(s.accept),并开启多线程处理信息。

  1. import socket
  2. import threading
  3. import time
  4. import sys
  5. def socket_service():
  6. try:
  7. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. # s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  9. s.bind(('127.0.0.1', 6668))
  10. s.listen(10)
  11. except socket.error as msg:
  12. print(msg)
  13. sys.exit(1)
  14. print('Waiting connection...')
  15. while True:
  16. conn, addr = s.accept()
  17. t = threading.Thread(target=deal_data, args=(conn, addr))
  18. t.start()
  19. def deal_data(conn, addr):
  20. print('Accept new connection from {0}'.format(addr))
  21. conn.send(('Hi, Welcome to the server!').encode())
  22. while 1:
  23. data = conn.recv(1024)
  24. print('{0} client send data is {1}'.format(addr,
  25. data.decode())) # b'\xe8\xbf\x99\xe6\xac\xa1\xe5\x8f\xaf\xe4\xbb\xa5\xe4\xba\x86'
  26. time.sleep(1)
  27. if data.decode() == 'exit' or not data:
  28. print('{0} connection close'.format(addr))
  29. conn.send(bytes('Connection closed!'), 'UTF-8')
  30. break
  31. conn.send(bytes('Hello, {0}'.format(data), "UTF-8")) # TypeError: a bytes-like object is required, not 'str'
  32. conn.close()
  33. if __name__ == '__main__':
  34. socket_service()
2. 通过socketserver模块创建server端

socketserver模块是Python标准库中的一个模块。它提供了一个简单的接口,可以方便地创建TCP和UDP服务器,支持多线程处理客户端连接。

  1. import socketserver
  2. import threading
  3. # 创建一个TCP服务器
  4. class MyTCPHandler(socketserver.BaseRequestHandler):
  5. def handle(self):
  6. # 接收客户端数据
  7. recv_data = self.request.recv(1024).strip()
  8. print(recv_data.decode())
  9. # 发送数据到客户端
  10. send_data = 'hello'
  11. self.request.sendall(send_data.encode())
  12. if __name__ == '__main__':
  13. with socketserver.ThreadingTCPServer(('127.0.0.1', 6668), MyTCPHandler) as server:
  14. server_thread = threading.Thread(target=server.serve_forever)
  15. server_thread.start()

client端

步骤:

1. 创建socket对象 s=socket.socket()

2. 连接server端 s.connect((ip,port))  #参数是元组

3. 发送/接受消息 s.send s.recv

  1. import socket
  2. import sys
  3. def socket_client():
  4. try:
  5. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. s.connect(('127.0.0.1', 6668))
  7. except socket.error as msg:
  8. print(msg)
  9. sys.exit(1)
  10. print(s.recv(1024)) # 目的在于接受
  11. while 1:
  12. data = input('please input work: ').encode()
  13. s.send(data)
  14. print('aa', s.recv(1024).decode())
  15. if data == 'exit':
  16. break
  17. s.close()
  18. if __name__ == '__main__':
  19. socket_client()

websocket案例

server端

通过websockets模块创建server端

  1. import asyncio
  2. import websockets
  3. from websockets.legacy.server import WebSocketServerProtocol
  4. async def ws_handle(websocket: WebSocketServerProtocol, path: str):
  5. async for message in websocket:
  6. print(f"客户端发送的信息为:{message}")
  7. await websocket.send(message)
  8. # print("send over")
  9. async def main():
  10. async with websockets.serve(ws_handle, "localhost", 8080):
  11. await asyncio.Future() # run forever
  12. if __name__ == "__main__":
  13. asyncio.run(main())

client端

1. 通过websockets模块创建客户端:
  1. import asyncio
  2. import websockets
  3. async def main():
  4. async with websockets.connect("ws://localhost:8080") as websocket:
  5. # websocket: <class 'websockets.legacy.client.WebSocketClientProtocol'>
  6. await websocket.send("Hello World")
  7. msg = await websocket.recv()
  8. print(msg)
  9. asyncio.run(main())
2. 通过websocket模块创建客户端:
  1. import threading
  2. import websocket
  3. url = "ws://localhost:8080/websocket/546"
  4. class WsClient(object):
  5. url = None
  6. ws = None
  7. def __init__(self, url):
  8. self.url = url
  9. def on_open(self,ws):
  10. print("WebSocket连接已建立")
  11. # 通过线程开始接收键盘输入,并send
  12. t = threading.Thread(self.run())
  13. t.start()
  14. def on_message(self, ws, message):
  15. print("接收到服务器发送的消息:%s" % message)
  16. def on_error(self, ws, error):
  17. print("WebSocket连接出错:%s" % error)
  18. def on_close(self, ws):
  19. print("WebSocket连接已关闭")
  20. def run(self):
  21. print("start run-开启线程接受键盘输入")
  22. while True:
  23. send_msg = input("我:")
  24. # print(f"信息为:{send_msg}")
  25. self.ws.send(send_msg)
  26. def start(self):
  27. # websocket.enableTrace(True)
  28. # self.ws = websocket.WebSocketApp(self.url)
  29. # self.ws.on_open = self.on_open
  30. # self.ws.on_error = self.on_error
  31. self.ws = websocket.WebSocketApp(self.url,
  32. on_open=self.on_open,
  33. on_message=self.on_message,
  34. on_close=self.on_close,
  35. on_error=self.on_error)
  36. self.ws.run_forever()
  37. if __name__ == "__main__":
  38. ws = WsClient(url)
  39. ws.start()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/85422
推荐阅读
相关标签
  

闽ICP备14008679号