自学内容网 自学内容网

网络编程上

二十二 网络编程上

22.1 socket套接字

import socket  # 网络编程模块,套接字

# 1.创建一个socket对象  socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET)
# 需要传递2个参数
第1个参数
    socket.AF_INET : ipv4
    第2个参数
    socket.SOCK_STREAM  TCP协议(流式协议)
        socket.SOCK_DGRAM   UDP协议(数据报协议)
   
# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1',8000))

# sock.bind(('ip',端口))
# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')
# 4.取出请求
conn,addr = sock.accept()  # 会返回一个元组,元组有2个值  三次握手
print('和客户端的连接对象:',conn)
print('客户端的信息',addr)

client.py

import socket

# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口

注意

recv -->接收数据--> decode解码
send -->发送数据--> encode编码

2对特殊的关系 (阻塞)

  • 服务端
    • conn,addr = sock.accept() # 阻塞 等待客户端连接
      • 客户端:sock.connect()
    • recv(1024) # 阻塞 等待客户端发送数据
      • 客户端:sock.send()

22.2 循环通信

server.py

import socket  # 网络编程模块,套接字

# 1.创建一个socket对象  socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1', 8000))

# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')

# 4.取出请求
conn, addr = sock.accept()  # 会返回一个元组,元组有2个值  三次握手
print('连接成功,客户端的信息', addr)
# 通信循环
while True:
    # 接收数据
    cai = conn.recv(1024).decode('utf-8')
    if cai == '':
        break

    print(f"客户端发来的数据:{cai}")
    if cai == '鸦片':
        conn.send('不贩毒,我要报警'.encode('utf-8'))
    else:
        conn.send("成功收到您的订单,稍后送达".encode('utf-8'))
conn.close()  # 断开与客户端的连接

client.py

import socket

# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口

while True:
    # 发送数据
    cai = input("请点菜(q/Q退出):").strip() # 清空前后空白
    if cai.upper() == 'Q':
        break

    sock.send(cai.encode('utf-8'))

    res = sock.recv(1024).decode('utf-8')
    print(res)

22.3 发空问题

客户端故意发送空字符串

server.py

import socket  # 网络编程模块,套接字

# 1.创建一个socket对象  socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1', 8000))

# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')

# 4.取出请求
conn, addr = sock.accept()  # 会返回一个元组,元组有2个值  三次握手
print('连接成功,客户端的信息', addr)
# 通信循环
while True:
    # 接收数据
    cai = conn.recv(1024).decode('utf-8')
    if cai == '':
        # 客户端断开了
        break

    print(f"客户端发来的数据:{cai}")
    if cai == '鸦片':
        conn.send('不贩毒,我要报警'.encode('utf-8'))
    else:
        conn.send("成功收到您的订单,稍后送达".encode('utf-8'))
conn.close()  # 断开与客户端的连接

client.py

import socket

# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口

while True:
    # 发送数据
    cai = input("请点菜(q/Q退出):").strip() # 清空前后空白
    if cai == '':
        print('请重新输入')
        continue
    if cai=='q' or cai=='Q':
        break

    sock.send(cai.encode('utf-8'))

    res = sock.recv(1024).decode('utf-8')
    print(res)

22.4 服务后再服务

server.py

import socket  # 网络编程模块,套接字

# 1.创建一个socket对象  socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1', 8000))

# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')


while True:
    # 4.取出请求
    conn, addr = sock.accept()  # 会返回一个元组,元组有2个值  三次握手
    print('连接成功,客户端的信息', addr)
    # 通信循环
    while True:
        # 接收数据
        cai = conn.recv(1024).decode('utf-8')
        if cai == '':
            # 客户端断开了
            break

        print(f"客户端发来的数据:{cai}")
        if cai == '鸦片':
            conn.send('不贩毒,我要报警'.encode('utf-8'))
        else:
            conn.send(f"成功收到您的订单[{cai}],稍后送达".encode('utf-8'))
    conn.close()  # 断开与客户端的连接
    print(addr[1],'已退出')

client.py

import socket

# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口

while True:
    # 发送数据
    cai = input("请点菜(q/Q退出):").strip() # 清空前后空白
    if cai == '':
        print('请重新输入')
        continue
    if cai=='q' or cai=='Q':
        break

    sock.send(cai.encode('utf-8'))

    res = sock.recv(1024).decode('utf-8')
    print(res)
sock.close()

22.5 udp

2个区别

1.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2.
接收 recvfrom
    发送 sendto

server.py

import socket

# 1.创建socket对象   UDP协议:socket.SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


# 2.绑定地址
sock.bind(('127.0.0.1',8080))

# 接收一个元组  (数据,对方的地址+端口)
data,addr = sock.recvfrom(1024)
print(data.decode('utf-8'))
print(addr)

client.py

import socket

# 1.创建socket对象   UDP协议:socket.SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)





cai = input('请输入一个菜:')

# 发送数据, 2个参数
# 1.数据 (编码)
# 2. 对方的地址和端口号

sock.sendto(cai.encode(), ('127.0.0.1',8080) )

原文地址:https://blog.csdn.net/2301_80202670/article/details/144372882

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!