疫情环境下的网络学习笔记 python 4.20

4.20笔记

正课

socket

计算机之间进行通信一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据

套接字家族的名字:AF_INET

preview

套接字 例

以打电话为例,分为服务端和客户端

# 服务端
import socket
# 1. 买手机:得到一个实例化对象
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. 绑定手机卡
phone.bind(('127.0.0.1',8000)) # 元组形式放ip+端口
# 3. 开机
phone.listen(5)  # backlog=5 半连接池的大小
# 4. 等待电话连接请求
conn,client_addr = phone.accept()
print(conn)
print('客户端的ip和端口:',client_addr)
# 5. 接收消息,发消息
data=conn.recv(1024)  # 最多接收数据1024bytes,bytes类型
# 客户端 服务端一次接收的数据有限,这个数值增大没有意义
conn.send(data.upper())
# 对接收的数据进行处理
# 6. 关闭电话连接conn
conn.close()
# 7. 可选操作:关机
phone.close
# 客户端
import socket
#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
#2、拨通服务端电话
phone.connect(('127.0.0.1',8080))
#3、通信
import time
time.sleep(2)
phone.send('歪比歪比'.encode('utf-8'))
data=phone.recv(1024)
print(data.decode('utf-8'))
#4、关闭连接(必选的回收资源的操作)
phone.close()

收发实际上是在跟自己的缓存打交道,向网卡要数据,不是一次send对应一次recv

处理bug

  1. 客户端输入空消息的时候continue

  2. 服务端在接收发送的时候客户端可能会被关闭:加入try except异常处理

  3. 把整个accept放进while 循环,一个客户端断开以后,close之后再建立一个新的连接,再接收别的客户端的数据

    以后会用并发代替,不会用

# 客户端
import socket
phone = socket.socket(-1,-1)
phone.connect(('127.0.0.1',8000))
while True:
    cmd = input('需要执行的指令:')
    if not cmd:
        continue
    if cmd == 'q':
        break
    phone.send(cmd.encode('utf-8'))
    data = phone.recv(1024)
    print(data.decode('utf-8'))
phone.close()

# 服务端
import socket
phone = socket.socket(-1,-1)
phone.bind(('127.0.0.1',8000))
phone.listen(5)
print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8000))
while True:
    conn, client_addr = phone.accept()
    print(client_addr)
    while True:
        try:
            data = conn.recv(1024)
            if len(data)==0:
                break
            print('接收到的数据:',data.decode('utf-8'))
            conn.send(f'{data}歪比巴布'.encode('utf-8'))
        except Exception as e:
            print(e)
            print('连接断开')
            break
    conn.close()

udp

# 客户端
import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    msg=input('>>: ').strip()
    if not msg:continue

    udp_server_client.sendto(msg.encode('utf-8'),ip_port)

    back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
    print(back_msg.decode('utf-8'),addr)
# 服务端
import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

udp_server_client.bind(ip_port)

while True:
    msg,addr=udp_server_client.recvfrom(BUFSIZE)
    print(msg,addr)

    udp_server_client.sendto(msg.upper(),addr)

猜你喜欢

转载自www.cnblogs.com/telecasterfanclub/p/12739531.html
今日推荐