8)基础网络编程和内容回顾

复习:之前的内容

图片1.png

图片2.png

图片3.png

图片4.png 

一、报错后的解决方法:

报错如何解决:

try:
    print(111)
    l = []
    l[2]
    int('a')
    print(222)
except ValueError:
    print('报错了')

except IndexError:
    print('baocuole')

结果:

111

baocuole

 

 

try:
    print(111)
    l = []
    l[2]
    int('a')
    print(222)
except ValueError as e :print(e)
except IndexError :print('索引不存在')#list index out of range

 

 

报错解决:

图片5.png 

总结:try

  excpet

  except  as

 

 

找到一个满足条件的其他分支都不走了

 

预料不到的是万能异常:

 

try:
    print(111)
    l = []
    l[2]
    int('a')
    print(222)
except:
    print('出错了')

 

第二种写法:

图片6.png  

缺点:不知道那里出问题了可以加上as   推荐使用

           try:
    print(111)
    l = []
    l[2]
    int('a')
    print(222)
except Exception as e :
    print(e)  #list index out of range

 

 

具体的异常处理+万能的异常:

#能够提前预料到的异常都应该具体的异常处理, 剩下的其他异常用万能异常控制

#万能异常应该卸载最后

 

exceptelse是互斥的如果执行了except那么else将不执行

 

try:
    l = [1]
    num = int(input('num:'))
    l[num]
except ValueError:print('请输入一个数字')
except IndexError:print('您要找的项目不存在')
except Exception as e :print(e)  #万能异常要写在最下面

else:
    print('执行else了')#num:0
                       #执行else了
    #如果执行try中的代码没有报错,那么就执行else中的代码了

 

 

图片7.png 

例如发邮件成功之后

 

 

def func():
    try:
        f = open('aaa','w')
        ret = f.read()
        return  ret
    except:
        print('error')
    finally:
        f.close()

 

finally优先级高于return一定会关闭,多用于关闭程序减轻内存

 

 

Raise 主动抛异常

不常用,这个方法

Raise ValueError

 

 

 

断言:

 

assert   1 ==2 # if条件判断

 

类似  if not 1==2:exit()

 

assert  1==2
#    assert  1==2   如果是1==1就可以了
#AssertionError

 

总结:

try   except else  finally

raise  错误类型 自定义异常  自定义一个类继承BaseExecption

断言  看源码

 

 

二、模块的使用和定义:

定义:就是py文件的导入  import 导入就能用的

图片8.png 

导入模块:

图片9.png

图片10.png

图片11.png

图片12.png

起一个别名:

 图片13.png

从一个模块同时导入多个模块:

图片14.png 

 

导入所有的

图片15.png

*__all__联合使用的,比如不想让使用某个功能,all中的是可以使用的

图片16.png 

 图片17.png

图片18.png


总结:

 

From import

任然会执行行整个文件

文件中的名字会被存储在一块独立的内存空间中

Import 后面的名字会出现在全局

相当于对独立命名空间中的一个引用

From import也支持as 导入多个名字

From import * 相当于导入所有名字 *__all__配合使用是互相影响的

三、包的定义和使用:

一组py文件组成的文件夹,在这个文件夹里有一个__init__.py的包

图片19.png

图片20.png 

四、网络编程:

服务器端


图片21.png

import socket

sk = socket.socket()  #买手机
sk.bind(('198.9.6.115',9000))#安装电话卡
sk.listen()#开机

conn,addr = sk.accept() # 等待来电话

conn.send(b'hello') #说了一句话hello
conn.close() # 挂断电话
sk.close() # 关机

 

 

图片22.png 

 

客户端

import socket

sk = socket.socket()
sk.connect(('198.9.6.115',9000))

print(sk.recv(1024)) #接受一个数据大小

sk.close()

 

 

 

 

 

 

双向发送和接收

Server端:

import socket

sk = socket.socket()  #买手机
sk.bind(('198.9.6.115',9000))#安装电话卡
sk.listen()#开机

conn,addr = sk.accept() # 等待来电话

conn.send(b'hello\n world') #说了一句话hello
print(conn.recv(1024))  #接受
conn.close() # 挂断电话
sk.close() # 关机

 

Client端:

import socket

sk = socket.socket()
sk.connect(('198.9.6.115',9000))

print(sk.recv(1024)) #接受一个数据大小
sk.send(b'bye')  # 发送
sk.close()

 

图片23.png 

 

 

服务端:

 

 

import socket

sk = socket.socket()  #买手机
sk.bind(('198.9.6.115',9000))#安装电话卡
sk.listen()#开机

conn,addr = sk.accept() # 等待来电话  三次握手
while True:
    msg = input('>>>')
    conn.send(msg.encode('utf-8')) #说了一句话hello
    if msg =='q':break
    ret = conn.recv(1024).decode('utf-8')
    if ret =='q':break
    print(ret)
conn.close() # 挂断电话
sk.close() # 关机

 

客户端:

import socket

sk = socket.socket()
sk.connect(('198.9.6.115',9000))
while True:
    ret = sk.recv(1024).decode('utf-8')#接受一个数据大小
    if ret =='q':break
    print(ret)
    msg = input('>>>')
    sk.send(msg.encode('utf-8'))  # 发送
    if msg =='q':break
sk.close()

 

 

如果要和另外一个聊就需要在家一个while True在服务端

 

 

Server端:

 

import socket

sk = socket.socket()  #买手机
sk.bind(('198.9.6.115',9001))#安装电话卡
sk.listen()#开机
while True:
    conn,addr = sk.accept() # 等待来电话  三次握手
    while True:
        msg = input('>>>')
        conn.send(msg.encode('utf-8')) #说了一句话hello
        if msg =='q':break
        ret = conn.recv(1024).decode('utf-8')
        if ret =='q':break
        print(ret)
    conn.close() # 挂断电话
sk.close() # 关机

 

 

客户端:

 

 

import socket

sk = socket.socket()
sk.connect(('198.9.6.115',9001))
while True:
    ret = sk.recv(1024).decode('utf-8')#接受一个数据大小
    if ret =='q':break
    print(ret)
    msg = input('>>>')
    sk.send(msg.encode('utf-8'))  # 发送
    if msg =='q':break
sk.close()

 

 

 

UDP的连接:

最简单的

Server端:

 

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8899))
msg,addr = sk.recvfrom(1024)
print(msg)
sk.close()

 

 

Client端:

 

 

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)

sk.sendto(b'hello',('127.0.0.1',8899))

sk.close()

 

 

 

 

 

 

 

 

 

 

 

服务器:

import  socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8898))
msg,addr = sk.recvfrom(1024)
sk.sendto(b'byebye',addr)
print(msg)
sk.close()

 

客户端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto(b'hello',('127.0.0.1',8898))
msg,addr = sk.recvfrom(1024)
print(msg)
sk.close()

 

 

 

 

Input

 

图片24.png 

 

 图片25.png

Server

图片26.png图片27.png

粘包:

只会发生在TCP协议中

 

图片28.png 

 


猜你喜欢

转载自blog.51cto.com/xiaorenwutest/2121956