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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。