Python Socket编程详细介绍
在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦。并且网上也没找到太好的封装,所以就自己写了个简单的封装。
封装思路
1.客户端每次请求均发送一个SocketRequest对象,其中封装具体的数据,这里使用json。对于要发送的数据,会自动添加一个结束符标识(EOF=‘0x00')。
2.服务器端接收数据时,根据结束符标识来生成完整的数据,并解包成SocketRequest对象。
3.服务器端根据SocketRequest的内容,来生成SocketResponse对象,这里使用了一个SimpleRequestHandler类来处理,例子中就是没有做任何处理,然后原样返回。
4.服务器端发送SocketResponse给客户端。其中也需要对包做一个封装,会自动添加一个结束符标识(EOF=‘0x00')。
5.客户接收数据时,根据结束符标识来生成完整的数据,并解包成SocketResponse对象,然后返回。
封装类
sockets.py
#!/usr/bin/envpython #-*-coding:utf-8-*- importsocket importpickle importthread PORT=12345 EOF='0x00' classSocketServer(object): def__init__(self,port=None): self.port=port defstartup(self): sock_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock_server.bind(('0.0.0.0',self.port)) sock_server.listen(0) whileTrue: sock,address=sock_server.accept() thread.start_new_thread(self.__invoke,(sock,address)) defshutdown(self): pass def__invoke(self,sock,address): try: full_data='' whileTrue: data=sock.recv(1024) ifdataisNone: return full_data+=data iffull_data.endswith(EOF): full_data=full_data[0:len(full_data)-len(EOF)] request=pickle.loads(full_data) response=SimpleRequestHandler().handle(request) sock.sendall(pickle.dumps(response)+EOF) return exceptExceptionase: printe finally: sock.close() classSocketClient(object): def__init__(self,host,port): self.host=host self.port=port defexecute(self,request): sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect((self.host,self.port)) try: sock.sendall(pickle.dumps(request)+EOF) full_data='' whileTrue: data=sock.recv(1024) ifdata: full_data+=data iffull_data.endswith(EOF): full_data=full_data[0:len(full_data)-len(EOF)] response=pickle.loads(full_data) returnresponse else: returnNone exceptExceptionase: printe returnNone finally: sock.close() classSocketRequest(object): def__init__(self,data): self.data=data def__repr__(self): returnrepr(self.__dict__) classSocketResponse(object): def__init__(self,data): self.data=data def__repr__(self): returnrepr(self.__dict__) classSimpleRequestHandler(object): def__init__(self): pass def__repr__(self): returnrepr(self.__dict__) defhandle(self,request): returnSocketResponse(request.data)
测试
socket_server.py
#!/usr/bin/envpython #-*-coding:utf-8-*- fromagent.socketsimport* ss=SocketServer(PORT) ss.startup()
socket_client.py
#!/usr/bin/envpython #-*-coding:utf-8-*- importpickle fromagent.socketsimport* sc=SocketClient('localhost',PORT) request=SocketRequest('abc') response=sc.execute(request) printrequest printresponse
运行测试
首先,运行socket_server.py
然后,运行socket_client.py
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。