Python Socket程式設計

2021-09-07 13:44:01 字數 3699 閱讀 2445

在使用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...