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

posted @ 2017-04-07 09:21  KaShing  阅读(390)  评论(0编辑  收藏  举报