python socket通信原理_Python Socket多线程并发原理及实现

1.SocketServer模块编写的TCP服务器端代码

Socketserver原理图

服务端:

import SocketServer #导入SocketServer,多线程并发由此类实现

class MySockServer(SocketServer.BaseRequestHandler): #定义一个类

def handle(self): #handle(self)方法是必须要定义的,可以看上面的说明

print 'Got a new connection from', self.client_address

while True:

data = self.request.recv(1024) #需要通过self的方法调用数据接收函数

if not data:break

print 'recv:', data

self.request.send(data.upper()) #需要通过self的方法调用数据接收函数

if __name__ == '__main__': #并非一定要用这样的方式,只是建议这样使用

HOST = '' #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有

PORT = 50007 #Server端开放的服务端口

s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)

#调用SocketServer模块的多线程并发函数

s.serve_forever() #持续接受客户端的连接

客户端:

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的实现的FTP程序

服务端:

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多线程并发原理及实现的详细内容,更多关于Python Socket多线程并发的资料请关注脚本之家其它相关文章!

你可能感兴趣的:(python,socket通信原理)