使用pythonsocket编程详解

这篇文章主要介绍了python socket编程详细介绍,socket可以建立连接,传递数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

在使用python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦。并且网上也没找到太好的封装,所以就自己写了个简单的封装。

封装思路

1. 客户端每次请求均发送一个 socketrequest 对象,其中封装具体的数据,这里使用json。对于要发送的数据,会自动添加一个结束符标识(eof = ‘0x00’)。

2. 服务器端接收数据时,根据结束符标识来生成完整的数据,并解包成 socketrequest 对象。

3. 服务器端根据 socketrequest 的内容,来生成 socketresponse 对象,这里使用了一个 simplerequesthandler 类来处理,例子中就是没有做任何处理,然后原样返回。

4. 服务器端发送 socketresponse 给客户端。其中也需要对包做一个封装,会自动添加一个结束符标识(eof = ‘0x00’)。

5. 客户接收数据时,根据结束符标识来生成完整的数据,并解包成 socketresponse 对象,然后返回。

封装类

sockets.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import pickle
import thread
port = 12345
eof = ‘0x00’
class socketserver(object):
def __init__(self, port=none):
self.port = port
def startup(self):
sock_server = socket.socket(socket.af_inet, socket.sock_stream)
sock_server.bind((‘0.0.0.0’, self.port))
sock_server.listen(0)
while true:
sock, address = sock_server.accept()
thread.start_new_thread(self.__invoke, (sock, address))
def shutdown(self):
pass
def __invoke(self, sock, address):
try:
full_data = ”
while true:
data = sock.recv(1024)
if data is none:
return
full_data += data
if full_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
except exception as e:
print e
finally:
sock.close()
class socketclient(object):
def __init__(self, host, port):
self.host = host
self.port = port
def execute(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 = ”
while true:
data = sock.recv(1024)
if data:
full_data += data
if full_data.endswith(eof):
full_data = full_data[0:len(full_data) – len(eof)]
response = pickle.loads(full_data)
return response
else:
return none
except exception as e:
print e
return none
finally:
sock.close()
class socketrequest(object):
def __init__(self, data):
self.data = data
def __repr__(self):
return repr(self.__dict__)
class socketresponse(object):
def __init__(self, data):
self.data = data
def __repr__(self):
return repr(self.__dict__)
class simplerequesthandler(object):
def __init__(self):
pass
def __repr__(self):
return repr(self.__dict__)
def handle(self, request):
return socketresponse(request.data)

测试

socket_server.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from agent.sockets import *
ss = socketserver(port)
ss.startup()

socket_client.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pickle
from agent.sockets import *
sc = socketclient(‘localhost’, port)
request = socketrequest(‘abc’)
response = sc.execute(request)
print request
print response

运行测试

首先,运行 socket_server.py

然后,运行 socket_client.py

以上就是使用python socket编程详解的详细内容,更多请关注 第一php社区 其它相关文章!

Posted in 未分类