10月10日学习内容整理:socketserver模块,ftp作业讲解

一、socketserver模块

1、作用:用来实现并发编程

2、py2和py3的区别:py3是socketserver   py2是SocketServer

3、和socket模块还有multiprocessing模块的区别:

》》》和socket模块:socket在py2中是只能实现串行编程,不能实现并发,只能等一个客户端执行完后才能执行下一个客户端;在py3中单纯的使用socket模块也可以多个客户端同时访问服务端,但也是只能一个客户端执行完后再执行下一个客户端,但是我们通常还是用socketserver模块

》》》和multiprocessing模块:若用socket模块和创建子进程模块(multiprocessing),其实是启用了server的多个子进程,实际上是启用了多个server,是对电脑资源的浪费;而socketserver模块就是实现并发编程的,只有一个server,多个客户端可以同时访问。

 

补充:对于socket模块,py3中send必须用字节类型,但在py2中可以用字符串类型发送

》》》》》举例

服务端

import socketserver
class MyServer(socketserver.BaseRequestHandler):    #固定   必须定义一个类且和下面的名字一样,必须继承
    def handle(self):    #固定 必须写handle函数 当客户端的连接请求过来时就拿到了self,就被实例化
        conn = self.request   #固定,就拿到了服务端的连接
        conn.sendall(bytes('欢迎致电 10086,请输入1xxx,0转人工服务.',encoding='utf-8'))
        Flag = True
        while Flag:
            data = conn.recv(1024).decode('utf-8')
            if data == 'exit':
                Flag = False
            elif data == '0':
                conn.sendall(bytes('通过可能会被录音.balabala一大推',encoding='utf-8'))
            else:
                conn.sendall(bytes('请重新输入.',encoding='utf-8'))
if __name__ == '__main__':   #固定
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8008),MyServer)   #固定,仍然是服务端的IP和端口号,类的名字可以自己取,但必须
                                               和定义的一样
server.serve_forever() #固定 这两句话就自动执行handle函数

 

客户端

import socket    #客户端没有区别
ip_port = ('127.0.0.1',8008)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5)
while True:
    data = sk.recv(1024).decode('utf-8')
    print('receive:',data)
    inp = input('please input:')
    sk.sendall(bytes(inp,encoding='utf-8'))
    if inp == 'exit':
        break
sk.close()

 

posted @ 2017-10-10 18:44  九二零  阅读(114)  评论(0)    收藏  举报