python 第二十一章 Socket编程

84 阅读4分钟

大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习python,写的可能不是很好,希望大家多多包涵。 每个赞都是我前进的动力

一、网络通信开发框架

1.web类:csdn,百度,博客园……直接用浏览器打开的

2.应用类:微信,qq,抖音……需要安装才能使用

这两类的软件通信分别对应了不同的开发框架

1.C/S架构
C/S(clinet,Server)就是客户端与服务端架构,这种架构是从用户层面进行划分,该模式对用户的环境系统依赖比较大
2.B/S架构
B/S(Browser和Server)就是浏览器和服务端的架构,该模式只需要通过浏览器发送http协议请求服务器,服务器响应对应的资源

二,socket_tcp通信

socket 套接字,用来实现网络编程进行数据传输的一种技术手段

socket 把复杂的tcp/ip协议都封装起来,我们只需要遵循socket的规定进行编写,就能实现网络通信

tcp传输的数据是可靠的,(基于连接)的通信协议
当对于网络通讯的质量比较高的时候,传输文件,浏览网页
udp传输的数据是不可靠的,会出现丢包的情况(基于非连接)
udp协议----》直播,视频通话,当实时性比较高


通信步骤;
1.连接
2.传输数据
3.关闭连接

服务端的创建流程
1.创建服务端socket对象
2.绑定自己的ip以及端口号
3.设置监听模式, 设置最大连接数
4.等待客户端连接
5.接受客户端连接
6.给客户端发送数据
7.关闭

socket --->bind ---->listen---->accept--->recv(收)/send(发) ----》close
# 服务端创建
import socket

# 1. 创建服务端socket对象

"""
socket_family  通络的类型  AF_INET 表示ipv4
socket_type    套接字类型:  SOCK_STREAM  表示tcp 套接字
"""
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 2. 绑定ip 以及端口
"""
bind 参数为一个元组  (ip, port)
("127.0.0.1", 20000)
"""
phone.bind(("127.0.0.1", 20000))


# 3. 设置监听模式 设置最大连接数
phone.listen(5)
print("服务端已启动,等待连接")
# 4.等待客户端连接
"""
1. 客户端连接的套接字对象, conn
2. 连接客户端地址  addr
"""
conn, addr = phone.accept()

# 5 接收客户端的数据
# recv 参数 表示每次最多接收最大的字节数
data = conn.recv(1024)
print(f"客户端发送的数据-----{data.decode('utf-8')}")

# 6.给客户端发送数据
conn.send(data)

# 7.关闭
conn.close()
phone.close()
# 客户端创建
import socket

# 1. 创建服务端socket对象

"""
socket_family  通络的类型  AF_INET 表示ipv4
socket_type    套接字类型:  SOCK_STREAM  表示tcp 套接字
"""
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 2. 连接服务器
# 连接 服务端的ip以及端口
phone.connect(("127.0.0.1", 20000))

# 发送数据
phone.send("同学们真帅".encode('utf-8'))

# 接受服务端的数据
data = phone.recv(1024)
print("服务端发送的数据------",data.decode('utf-8'))

# 关闭套接字对象
phone.close()

添加循环

# 服务端创建
import socket

# 1. 创建服务端socket对象

"""
socket_family  通络的类型  AF_INET 表示ipv4
socket_type    套接字类型:  SOCK_STREAM  表示tcp 套接字
"""
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 2. 绑定ip 以及端口
"""
bind 参数为一个元组  (ip, port)
("127.0.0.1", 20000)
"""
phone.bind(("127.0.0.1", 20000))


# 3. 设置监听模式 设置最大连接数
phone.listen(5)
print("服务端已启动,等待连接")
# 4.等待客户端连接
"""
1. 客户端连接的套接字对象, conn
2. 连接客户端地址  addr
"""
conn, addr = phone.accept()

while 1:
    try:
        # 5 接收客户端的数据
        # recv 参数 表示每次最多接收最大的字节数
        data = conn.recv(1024)
        if len(data) == 0:
            print("客户端发送空数据处理")
            raise ConnectionResetError
        print(f"客户端发送的数据-----{data.decode('utf-8')}")

        # 6.给客户端发送数据
        conn.send(data)
    except ConnectionResetError:
        break


# 7.关闭
conn.close()
phone.close()
# 客户端创建
import socket

# 1. 创建服务端socket对象

"""
socket_family  通络的类型  AF_INET 表示ipv4
socket_type    套接字类型:  SOCK_STREAM  表示tcp 套接字
"""
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 2. 连接服务器
# 连接 服务端的ip以及端口
phone.connect(("127.0.0.1", 23000))

while 1:
    msg = input("请输入数据(q:退出)").strip()
    # 判断信息是否为空
    if not msg:
        continue
    if msg == 'q':
        break
    # 发送数据
    phone.send(msg.encode('utf-8'))

    # 接受服务端的数据
    data = phone.recv(1024)
    print("服务端发送的数据------",data.decode('utf-8'))

# 关闭套接字对象
phone.close()

三,socket_udp通信

# udp服务端
import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

phone.bind(('127.0.0.1', 20001))

while True:
    # 接收消息
    msg, client = phone.recvfrom(1024)
    print('客户端数据---------',msg.decode('utf-8'))
    phone.sendto(msg, client)


import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

ip_port = ('127.0.0.1', 20001)

while True:
    msg = input("..(q:退出)").strip()
    if msg == 'q':
        break
    # 发送消息
    phone.sendto(msg.encode("utf-8"), ip_port)
    # 接收消息
    get_data, server = phone.recvfrom(1024)
    print(get_data.decode('utf-8'))