标签:code prot read 查看 isp app 并发处理 内部使用 type
TCP:
UDP:
粘包现象:
socket
socketserver内部使用io多路复用,以及多线程和多进程,从而实现并发处理多个客户端请求的socket服务端
即:每个客户端请求连接到服务器时,socket服务端都会在服务器端创建一个线程或者进程,负责处理对应的客户端请求
它的基础使用的时socket
Threading TCPServer实现的是:socket服务器内部为每个client创建一个线程
下面查看一下其内部的部分代码
class BaseRequestHandler: def __init__(self, request, client_address, server): self.request = request self.client_address = client_address self.server = server self.setup() try: self.handle() finally: self.finish() def setup(self): pass def handle(self): pass def finish(self): pass
所以使用socketserver有其固定的部分
服务端: import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): # print(self.request) server = socketserver.ThreadingTCPServer((ip,port),MyServer) server.serve_forever()
下面来看其用法:
服务端:
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): while True: print(self.request) data=input(‘>>>‘).strip() self.request.send(data.encode(‘utf-8‘)) print(self.request.recv(1024)) if __name__ == ‘__main__‘: server=socketserver.ThreadingTCPServer((‘127.0.0.1‘,9000),Myserver) server.serve_forever()
客户端
import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,9000)) while True: print(sk.recv(1024)) inp=input(‘>>>‘).encode(‘utf-8‘) sk.send(inp) sk.close()
接下来:先启动服务端,再启动两个客户端 其结果如下:
说明:启动客户端后,再启动一个客户端,服务器先发一条信息,这个客户端接到信息,接着启动第二个客户端
服务端的情况 <socket.socket fd=428, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 49750)> >>>who b‘client2‘ <socket.socket fd=512, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 49753)> >>>1 b‘client1 -1‘ <socket.socket fd=428, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 49750)> >>>1 b‘2‘ <socket.socket fd=512, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 49753)> >>>hehe b‘client‘ <socket.socket fd=428, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 49750)> >>>3 b‘haohao‘ <socket.socket fd=512, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 49753)> >>>
result: 信息可以输入的顺序:先服务器输入信息,第一个客户端接收,发送信息,接着回到服务端,服务端再发一条信息,第二个客户端收到,再回到服务端,周而复始。。。
下面演变为:让两个客户端通信,设置为client先发信息,接着client2再发
服务器端: import socketserver l=[] class Myserver(socketserver.BaseRequestHandler): def handle(self): l.append(self.request) print(l) while True: data=l[0].recv(1024) l[1].send(data) data2=l[1].recv(1024) l[0].send(data2) if __name__ == ‘__main__‘: server=socketserver.ThreadingTCPServer((‘127.0.0.1‘,9000),Myserver) server.serve_forever() 客户端 client import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,9000)) while True: inp=input(‘>>>‘).encode(‘utf-8‘) sk.send(inp) data=sk.recv(1024).decode(‘utf-8‘) print(data) sk.close() 客户端 client2 import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,9000)) while True: print(sk.recv(1024).decode(‘utf-8‘)) inp=input(‘>>>‘).encode(‘utf-8‘) sk.send(inp) sk.close()
结果显示:
服务端: [<socket.socket fd=588, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 50089)>] [<socket.socket fd=588, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 50089)>, <socket.socket fd=608, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9000), raddr=(‘127.0.0.1‘, 50091)>] 客户端client >>>nihao nihao >>>你是谁 我是client2 >>>幸会,我这是client 客户端 client2 nihao >>>nihao 你是谁 >>>我是client2 幸会,我这是client >>>
socketserver的最终解释:server可以接收多个客户端,会根据先后顺序记录下面,server端发信息,按照客户端连接的顺序来的.
server -->client
client --->server
server --->client2
client2 --->server
server---->client 。。。。。周而复始
进度条 --- socket ---socketserver
标签:code prot read 查看 isp app 并发处理 内部使用 type
原文地址:https://www.cnblogs.com/mmyy-blog/p/9389926.html