python中socket怎么用_Python3 中socket使用

1.动态导入模块

在当前目录下有lib和test目录,在test中要想使用lib中的aa的C类:

test中:

第一种方法:推荐

importlib.import_module('lib.aa')

obj = aa.c()

第二种方法:(python内部解释器用的)

lib = __import__("lib.aa")

obj  = lib.aa.C()

2.断言:assert(预判,断定)

assert type("dsds") is str

print("yes")

如果断言错误,即"dsds"的类型不是str,则程序不能继续运行,会报错

若接下来的代码运行时非常重要,最好提前用断言

2.socket

Socket Families(地址簇)

socket.AF_UNIX unix本机进程间通信

socket.AF_INET IPV4

socket.AF_INET6  IPV6

Socket Types  类型

socket.SOCK_STREAM  #for tcp

socket.SOCK_DGRAM   #for udp

实际例子:

服务器端:

import socket

server = socket.socket()

server.bind(('localhost',6969))

server.listen(5)

print('The server is ready')

while True:

conn,addr = server.accept()

print('The client is connected !!!')

while True:

data = conn.recv(1024)

print('recv:',data.decode())

conn.send(data.upper())

server.close

客户端:

import socket

client = socket.socket()

client.connect(('localhost',6969))

while True:

msg = input('ibput>>').strip()

if len(msg) == 0:

continue

client.send(msg.encode('utf-8'))

data = client.recv(1024)

print('recv:',data.decode())

client.close()

实现回显数据:

服务器:

import socket,os

server = socket.socket()

server.bind(('localhost',6969))

server.listen(5)

print('The server is ready')

while True:

conn,addr = server.accept()

print('The client is connected !!!')

while True:

data = conn.recv(1024)

if not data:

break

# print('recv:',data.decode())

# conn.send(data.upper())

res = os.popen(data.decode()).read()

print('before send:',len(res))

if len(res) == 0:

res = 'cmd has no input'

conn.send(res.encode())

server.close

客户端:

import socket

client = socket.socket()

client.connect(('localhost',6969))

while True:

msg = input('ibput>>').strip()

if len(msg) == 0:

continue

client.send(msg.encode('utf-8'))

data = client.recv(1024)

print('recv:',data.decode())

client.close()

可以回显全部的数据

利用了循环知道返回全部的数据长度

服务器端:

import socket,os

server = socket.socket()

server.bind(('localhost',6969))

server.listen(5)

print('The server is ready')

while True:

conn,addr = server.accept()

print('The client is connected !!!')

while True:

data = conn.recv(1024)

if not data:

break

res = os.popen(data.decode()).read()

print('before send:',len(res))

if len(res) == 0:

res = 'cmd has no input'

conn.send(str(len(res.encode())).encode())

conn.send(res.encode())

server.close

客户端:

import socket

client = socket.socket()

client.connect(('localhost',6969))

while True:

msg = input('ibput>>').strip()

if len(msg) == 0:

continue

client.send(msg.encode('utf-8'))

data_size = client.recv(1024)

print("The size is :",data_size.decode())

received_size = 0

received_data = b''

while received_size < int(data_size.decode()):

data = client.recv(1024)

received_size += len(data)

received_data += data

print(received_size)

else:

print('cmd res receive done...',received_size)

print(data.decode())

client.close()

实现FTP的下载功能:

服务器:

import socket,os,hashlib

server = socket.socket()

server.bind(('localhost',6969))

server.listen(5)

print('The server is ready')

while True:

conn,addr = server.accept()

print('The client is connected !!!')

while True:

data = conn.recv(1024)

if not data:

print('The client is gone...')

break

cmd,filename = data.decode().split()

print(filename)

if os.path.isfile(filename):

f = open(filename,'rb')

m = hashlib.md5()

file_size = os.stat(filename).st_size

conn.send(str(file_size).encode())

conn.recv(1024) #wait for ack

for line in f:

m.update(line)

conn.send(line)

print('file md5',m.hexdigest())

f.close()

print('send done')

server.close

客户端:

import socket

client = socket.socket()

client.connect(('localhost',6969))

while True:

cmd = input('ibput>>').strip()

if len(cmd) == 0:

continue

if cmd.startwith('get'):

client.send(cmd.encode('utf-8'))

server_reponse = client.recv(1024)

print('server response:',server_reponse)

client.send(b'ready to recv file')

file_total_size = int(server_reponse.decode())

received_size = 0

filename = cmd.split()[1]

f = open(filename + '.new','wb')

while received_size < file_total_size:

data = client.recv(1024)

received_size += len(data)

f.write(data)

print(file_total_size,received_size)

else:

print('file recv done',file_total_size,received_size)

f.close()

client.close()

实现FTP的交互:

服务器:

import socketserver,json,os

class MyTCPHandler(socketserver.BaseRequestHandler):

def put(self,*args):

'''接收客户端文件'''

cmd_dic = args[0]

filename = cmd_dic['filename']

filesize = cmd_dic['size']

if os.path.isfile(filename):

f = open(filename+'.new','wb')

else:

f = open(filename,'wb')

self.request.send(b'200 ok')

received_size = 0

while received_size < filesize:

data = self.request.recv(1024)

f.write(data)

received_size += len(data)

else:

print('file [%s] has uploaded'%filename)

f.close()

def get(self,*args):

cmd_dic = args[0]

filename = cmd_dic['filename']

filesize = os.stat(filename).st_size

if os.path.isfile(filename):

self.request.send(str(filesize).encode())

client_request = self.request.recv(1024)

f = open(filename,'rb')

for line in f:

self.request.send(line)

else:

f.close()

else:

print('file [%s] is not exist...'%filename)

def handle(self):

while True:

try:

print('{} wrote:'.format(self.client_address[0]))

self.data = self.request.recv(1024).strip()

print(self.data)

cmd_dic = json.loads(self.data.decode())

action = cmd_dic['action']

if hasattr(self,action):

func = getattr(self,action)

func(cmd_dic)

except ConnectionResetError as e:

print('err',e)

break

if __name__ == '__main__':

HOST,PORT = 'localhost',9999

server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)

server.serve_forever()

客户端:

import socket,os,json

class FtpClient(object):

def __init__(self):

self.client = socket.socket()

def help(self):

msg = '''

ls

pwd

cd ../..

get filename

put filename

'''

print(msg)

def connect(self):

self.client.connect(('localhost',9999))

def interaction(self):

#self.authenticate()

while True:

cmd = input('>>').strip()

if len(cmd) == 0:continue

cmd_str = cmd.split()[0]

if hasattr(self,'cmd_%s'%cmd_str):

func = getattr(self,'cmd_%s'%cmd_str)

func(cmd)

else:

self.help()

def cmd_put(self,*args):

cmd_spilt = args[0].split()

if len(cmd_spilt) > 1:

filename = cmd_spilt[1]

if os.path.isfile(filename):

filesize = os.stat(filename).st_size

msg_dic = {

'action':'put',

'filename':filename,

'size':filesize,

'overridden':True

}

self.client.send(json.dumps(msg_dic).encode('utf-8'))

#防止粘包,等服务器确认

server_reponse = self.client.recv(1024)

f = open(filename,'rb')

for line in f:

self.client.send(line)

else:

print('file uupload success...')

f.close()

else:

print(filename,'is not exist')

def cmd_get(self,*args):

cmd_spilt = args[0].split()

if len(cmd_spilt) > 1:

filename = cmd_spilt[1]

msg_dic = {

'action': 'get',

'filename': filename

}

self.client.send(json.dumps(msg_dic).encode('utf-8'))

filesize = self.client.recv(1024)

self.client.send(b'200 ok')

if os.path.isfile(filename):

f = open(filename+'.new','wb')

else:

f = open(filename,'wb')

receive_size = 0

while int(filesize.decode()) > receive_size:

data = self.client.recv(1024)

f.write(data)

receive_size += len(data)

else:

print('file [%s] is downloaded...'%filename)

f.close()

ftp = FtpClient()

ftp.connect()

ftp.interaction()

使用方法:例如get filename  或者   put filename

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值