在使用python做socket程式設計時,因為須要使用堵塞(預設)的方式來讀取資料流。此時對於資料的結束每次都須要自己處理。太麻煩。
而且網上也沒找到太好的封裝。所以就自己寫了個簡單的封裝。
封裝思路
1. 客戶端每次請求均傳送乙個 socketrequest 物件,當中封裝詳細的資料。這裡使用json。
對於要傳送的資料,會自己主動加入乙個結束符標識(eof = 『0x00』)。
2. 伺服器端接收資料時。依據結束符標識來生成完整的資料,並解包成 socketrequest 物件。
3. 伺服器端依據 socketrequest 的內容,來生成 socketresponse 物件。這裡使用了乙個 ******requesthandler 類來處理,樣例中就是沒有做不論什麼處理。然後原樣返回。
4. 伺服器端傳送 socketresponse 給客戶端。
當中也須要對包做乙個封裝,會自己主動加入乙個結束符標識(eof = 『0x00』)。
5. 客戶接收資料時,依據結束符標識來生成完整的資料,並解包成 socketresponse 物件。然後返回。
#!/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
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)
while
true:
sock, address = sock_server.accept()
thread.start_new_thread(self.__invoke, (sock, address))
defshutdown
(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 = ******requesthandler().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
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 = ''
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
******requesthandler
(object):
def__init__
(self):
pass
def__repr__
(self):
return repr(self.__dict__)
defhandle
(self, request):
return socketresponse(request.data)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from agent.sockets import *
ss = socketserver(port)
ss.startup()
#!/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 程式設計
client import socket,sys if name main 處理引數 argv sys.argv if len argv 3 or len argv 2 and argv 1 print useage argv 0 sys.exit 0 host argv 1 server ip位址...
python socket程式設計
python 編寫server的步驟 1.第一步是建立socket物件。呼叫socket建構函式。如 socket socket.socket family,type family引數代表位址家族,可為af inet或af unix。af inet家族包括internet位址,af unix家族用於...
python socket程式設計
客戶端 author lenovo fromsocketimport host localhost port 2157 bufsize 1024 addr host,port tcpclient socket af inet,sock stream tcpclient.connect addr wh...