day27 python面向对象多继承 网络编程 socket模块

day27 python面向对象多继承 网络编程 socket模块
 
一.面向对象多继承之c3算法
    1.简单继承
class A:
    def f1(self):
        print('A')
class B:
    def f1(self):
        print('B')
class C(A,B):
    def f1(self):
        print('C')
obj = C()
obj.f1()                #继承顺序: 先找自己, 然后先找左, 再找右
    2.经典类和新式类
        经典类: 没有继承object的类
        新式类: 继承了object的类
py3
    都是新式类: 默认都是继承object, 所以都是新式类
py2.2以后, 才出现了经典类和新式类
    新式类: 如果自己或自己的父类, 有人继承了 object , 那么此类就是新式类: 按c3算法查找
    经典类: 和新式类的查找顺序不一样: 一条道走到黑(深度优先),
    3.c3算法
class A:
    pass
class B(A):
    pass
class C(B):
    pass
class D:
    pass
class E(D,C):
    pass
class F:
    pass
class G(F):
    pass
class H(C,G):
    pass
class Foo(E,H):
    pass                                                 #继承顺序之c3算法:
                                                         #自己先拿出来, 最优先,先安放好
L(E) = D,object + C,B,A,object                           #拿出第一个的表头,和第二个(除表头)比, 如果没有相等的, 把第一个表头去掉并安放好
>>>E,D,C,B,A,object                                      #如果有相等的, 第一个表头就不动, 然后从第二个拿出表头, 和第一个(除表头比)  
                                                         #依次类推, c3 算法可以得到继承顺序
L(H) = C,B,A,object + G,F,object
>>>H,C,B,A,G,F,object
 
L(Foo) = E + H
L(Foo) = E,D,C,B,A,object + H,C,B,A,G,F,object
>>>Foo,E,D,H,C,B,A,G,F,object
    4.验证c3算法: 类名.__mro__
print(Foo.__mro__)                                      #查看这个类的继承顺序
>>>(<class '__main__.Foo'>, <class '__main__.E'>, <class '__main__.D'>, <class '__main__.H'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.G'>, <class '__main__.F'>, <class 'object'>)
    5.面向对象的注意事项
        super()是遵循 __mro__ 执行顺序, python2里没有__mro__这个功能, python3中才有
 
二.网络基础
网络编程
     客户端: 
        cs架构: client - server
        浏览器: bs架构 browser - server
    如何实现相互通信
        需求: 编写两个软件, 软件之间能相互通信
 
三.编写网络相关的程序
    1.基于socket模块实现网络通讯
        1.1.server端
import socket
print('in server')
server = socket.socket()                #创建了一个socket对象
server.bind(('127.0.0.1', 65530))       #绑定ip和端口
server.listen(5)                        #后面可以等5个人
conn, addr = server.accept()            #等待客户端来连接,如果没人来就傻傻地等 #conn服务端和客户端连接的对象,服务端以后要通过该对象进行收发数据; addr是客户端的地址信息
print(conn,addr)
data = conn.recv(2048)                  #收数据: 通过对象获取客户端的信息, 一次性最多(最大)接收多少字节
print(data)
conn.send(b'my name is bajie')          #发数据: 发的也是字节
conn.close()                            #与客户端断开连接
server.close()                          #断开服务端的连接
        1.2.client端
import socket
print('in client')
client = socket.socket()
client.connect(('127.0.0.1',65530))
client.send(b'client connect')
data = client.recv(2048)
print(data)
client.close()
    2.为什么网络通信发送的是字节, 而不是字符串
        在py3的时候: send/recv都是字节; 字符串默认是unicode编码(占资源,所以要传字节码,目的是空间压缩)
        在py2的时候: send/recv都是字符串, 和socket无关, 和编码有关
      哪里会阻塞:
         server: accept/recv
         client: connect/recv
        2.1.server端  
import socket
server = socket.socket()
server.bind(('127.0.0.1', 65532))
server.listen(5)
while True:
    conn,addr = server.accept()
    while True:
        data = conn.recv(2048)
        if data == b'exit':
            break
        else:
            responce = data + b'--bajieaishuishui'
            conn.send(responce)
    conn.close()
server.close()
        2.2.client端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 65532))
while True:
    data = input('>>> ')
    if data == 'exit':
        break
    client.send(data.encode('utf-8'))
    message = client.recv(2048)
    print(message.decode('utf-8'))    
    3:传输层的端口范围
        0<-    well-known    ->254<-    保留unix    ->1024<-     自定义    ->65536
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/aiaii/p/12217229.html
今日推荐