Python Socket多線程并發(fā)原理及實(shí)現(xiàn)
更新時(shí)間:2020年12月11日 10:45:29 作者:看雪。
這篇文章主要介紹了Python Socket多線程并發(fā)原理及實(shí)現(xiàn),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
1.SocketServer模塊編寫的TCP服務(wù)器端代碼
Socketserver原理圖

服務(wù)端:
import SocketServer #導(dǎo)入SocketServer,多線程并發(fā)由此類實(shí)現(xiàn)
class MySockServer(SocketServer.BaseRequestHandler): #定義一個(gè)類
def handle(self): #handle(self)方法是必須要定義的,可以看上面的說明
print 'Got a new connection from', self.client_address
while True:
data = self.request.recv(1024) #需要通過self的方法調(diào)用數(shù)據(jù)接收函數(shù)
if not data:break
print 'recv:', data
self.request.send(data.upper()) #需要通過self的方法調(diào)用數(shù)據(jù)接收函數(shù)
if __name__ == '__main__': #并非一定要用這樣的方式,只是建議這樣使用
HOST = '' #定義偵聽本地地址口(多個(gè)IP地址情況下),這里表示偵聽所有
PORT = 50007 #Server端開放的服務(wù)端口
s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
#調(diào)用SocketServer模塊的多線程并發(fā)函數(shù)
s.serve_forever() #持續(xù)接受客戶端的連接
客戶端:
import socket
HOST = '192.168.1.13'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
user_input = raw_input('msg to send:').strip()
s.sendall(user_input)
data = s.recv(1024)
print 'Received', repr(data)
s.close()
2.基于Python Socketserver的實(shí)現(xiàn)的FTP程序
服務(wù)端:
import socketserver
import struct
import json
import os
class FtpServer(socketserver.BaseRequestHandler):
coding='utf-8'
server_dir='file_upload'
max_packet_size=1024
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
def handle(self):
print(self.request)
while True:
data=self.request.recv(4)
data_len=struct.unpack('i',data)[0]
head_json=self.request.recv(data_len).decode(self.coding)
head_dic=json.loads(head_json)
# print(head_dic)
cmd=head_dic['cmd']
if hasattr(self,cmd):
func=getattr(self,cmd)
func(head_dic)
def put(self,args):
file_path = os.path.normpath(os.path.join(
self.BASE_DIR,
self.server_dir,
args['filename']
))
filesize = args['filesize']
recv_size = 0
print('----->', file_path)
with open(file_path, 'wb') as f:
while recv_size < filesize:
recv_data = self.request.recv(self.max_packet_size)
f.write(recv_data)
recv_size += len(recv_data)
print('recvsize:%s filesize:%s' % (recv_size, filesize))
ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()
客戶端:
import socket
import struct
import json
import os
class MYTCPClient:
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
allow_reuse_address = False
max_packet_size = 8192
coding='utf-8'
request_queue_size = 5
def __init__(self, server_address, connect=True):
self.server_address=server_address
self.socket = socket.socket(self.address_family,
self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close()
raise
def client_connect(self):
self.socket.connect(self.server_address)
def client_close(self):
self.socket.close()
def run(self):
while True:
inp=input(">>: ").strip()
if not inp:continue
l=inp.split()
cmd=l[0]
if hasattr(self,cmd):
func=getattr(self,cmd)
func(l)
def put(self,args):
cmd=args[0]
filename=args[1]
if not os.path.isfile(filename):
print('file:%s is not exists' %filename)
return
else:
filesize=os.path.getsize(filename)
head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
print(head_dic)
head_json=json.dumps(head_dic)
head_json_bytes=bytes(head_json,encoding=self.coding)
head_struct=struct.pack('i',len(head_json_bytes))
self.socket.send(head_struct)
self.socket.send(head_json_bytes)
send_size=0
with open(filename,'rb') as f:
for line in f:
self.socket.send(line)
send_size+=len(line)
print(send_size)
else:
print('upload successful')
client=MYTCPClient(('127.0.0.1',8080))
client.run()
以上就是Python Socket多線程并發(fā)原理及實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Python Socket多線程并發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
- Python 聊聊socket中的listen()參數(shù)(數(shù)字)到底代表什么
- python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令
- Python基于Socket實(shí)現(xiàn)簡(jiǎn)易多人聊天室的示例代碼
- Python WebSocket長(zhǎng)連接心跳與短連接的示例
- 用Python進(jìn)行websocket接口測(cè)試
- Python使用socket模塊實(shí)現(xiàn)簡(jiǎn)單tcp通信
- python Socket網(wǎng)絡(luò)編程實(shí)現(xiàn)C/S模式和P2P
- Python基礎(chǔ)之Socket通信原理
相關(guān)文章
python字典進(jìn)行運(yùn)算原理及實(shí)例分享
在本篇文章里小編給大家整理的是一篇關(guān)于python字典進(jìn)行運(yùn)算原理及實(shí)例分享內(nèi)容,有需要的朋友們可以測(cè)試下。2021-08-08
使用Python進(jìn)行體育競(jìng)技分析(預(yù)測(cè)球隊(duì)成績(jī))
這篇文章主要介紹了用Python進(jìn)行體育競(jìng)技分析(預(yù)測(cè)球隊(duì)成績(jī)),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
python 搭建簡(jiǎn)單的http server,可直接post文件的實(shí)例
今天小編就為大家分享一篇python 搭建簡(jiǎn)單的http server,可直接post文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python3如何實(shí)現(xiàn)列表模糊匹配列表
這篇文章主要介紹了Python3如何實(shí)現(xiàn)列表模糊匹配列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

