复习:之前的内容

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

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

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

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

一、报错后的解决方法:

报错如何解决:

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

 

 

报错解决:

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

总结:try

  excpet

  except  as

 

 

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

 

预料不到的是万能异常:

 

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

 

第二种写法:

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

缺点:不知道那里出问题了可以加上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中的代码了

 

 

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

例如发邮件成功之后

 

 

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)基础网络编程和内容回顾_网络_08 

导入模块:

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

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

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

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

起一个别名:

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

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

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

 

导入所有的

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

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

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

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

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


总结:

 

From import

任然会执行行整个文件

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

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

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

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

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

三、包的定义和使用:

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

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

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

四、网络编程:

服务器端


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

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() # 关机

 

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

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

 

客户端

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()

 

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

 

 

服务端:

 

 

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()

 

 

 

 

Input8)基础网络编程和内容回顾_基础_25

 

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

 

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

Server

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

粘包:

只会发生在TCP协议中

 

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

 解决粘包问题:



Server

 

import socket
import struct
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()


conn,addr = sk.accept()
inp = input('>>>').encode('utf-8')
chang = len(inp)
bytes_msg = struct.pack('i',chang)
conn.send(bytes_msg)
conn.send(inp)
conn.send(b'alex')
conn.close()
sk.close()

 

 

Client端:

 

import socket
import struct
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
num = sk.recv(4)
num = struct.unpack('i',num)[0]
print('------1',sk.recv(num).decode('utf-8'))
print('-----------2',sk.recv(num).decode('utf-8'))#jieshoushuju
sk.close()