网络编程 1.socket

socket

socket(套接字),是支持TCP/IP网络通信的基本操作单元,提供的方法可以实现数据的发送和接收
socket可以看作是不同主机之间进程进行双向通信的端点,即通信双方的一种约定
网络上各种服务大多基于socket完成通信,如网页、email等

|          应用程序 |                                     | 应用程序            |
|            套接字 |                                     | 套接字              |
| UDP/TCP(传输方式) |                                     | UDP/TCP(传输方式) |
|  IP(网络协议地址) |  →  通信通道   IP   通信通道  →   | IP(网络协议地址)  |

socket起源于Unix,Unix基本思想之一就是一切皆文件,即对于文件,用打开、读写、关闭的模式来操作
socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket类就是对其进行的操作(读写I/O、开、关)

多条信息发送到同一地址且未接收时,会以队列的方式储存在socket的接收缓冲区

发送端/接收端端口绑定
    发送端:可以不绑定端口,接收端:必须绑定端口
    每次运行网络程序时,如果没有确定用哪个端口,系统默认会随机分配
    网络程序运行过程中,端口号唯一标识这个程序
    如果其他计算机上的程序想向此程序发送数据,那么向这个端口号标识的程序发送即可

广播
    广播地址(broadcast address)是专门用于同时向网络中所有工作站进行发送的一个地址
    在使用TCP/IP协议的网络中,主机标识段host ID全部为1的IP地址为广播地址:255.255.255.255

socket
socket.socket(AddressFamily,Type)
        功能:创建socket对象
        参数:
            AddressFamily(地址簇):socket.AF_INET    默认,IPv4
                                    socket.AF_INET6    IPv6
            Type(类型):socket.SOCK_STREAM    默认,流式socket,for TCP
                         socket.SOCK_DGRAM    数据报式socket,for UDP

obj.sendto(data.encode(),Address)
        功能:发送数据
        参数:
            data.encode():数据的二进制格式
            Address:('IP',port),接收端信息,第一个元素为字符串的IP地址,第二个元素为整型的端口号

obj.recvfrom(m)
        功能:接收数据,此方法会造成程序阻塞,直至接收到另一台计算机发送的数据才解除阻塞
        参数:
            m:接收缓冲区大小,每次接收m字节的数据
        返回值:tuple,第一个元素为二进制格式的数据内容,第二个元素为发送端的Address

obj.bind(Address)
        功能:将socket对象绑定到一个地址,这个地址必须是没有被占用的,否则连接失败
        参数:
            Address:('IP',port),本机信息,IP可省略,表示本机的任何一个IP
                    接收端IP写为'',当计算机有多个网卡时,不同网卡的数据都能被接收

obj.setsockopt(socket,属性,属性值)
        功能:设置权限
        参数:
            socket:
                socket.SOL_SOCKET:当前socket
            属性:
                socket.SO_BROADCAST:广播
                socket.SO_REUSEADDR:socket地址可重用
            属性值:bool

obj.connect(Address)
        功能:与服务端建立连接
        参数:服务端的IP、port

obj.listen(n)
        功能:设置socket为被动监听模式,此时不能主动发送数据
        参数:允许连接的最大客户端数,此限制只在Windows下生效,Linux下无效

obj.accept()
        功能:开始接收客户端连接,默认进入阻塞,等待客户端连接,有客户端连接时解除阻塞
        返回值:两个元素的tuple,第一个元素为与连接客户端对应的socket对象,第二个元素为客户端Address

# 创建socket
# python中使用socket模块中的socket类来创建
import socket

# 创建套接字,使用IPv4,UDP
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 端口绑定
addr = ('192.168.124.35',9999)
udp_socket.bind(addr)

# 发送数据
addr_st = ('192.168.124.35',8080)
context_byte = 'wow'.encode()
udp_socket.sendto(context_byte,addr_st)

# 接收数据
# 接收二进制数据
recv_data = udp_socket.recvfrom(1024)
# 解码数据
recv_text = recv_data[0].decode('GBK')
# 输出接收到的内容
print(f'收到来自:{recv_data[1]}的数据:' + recv_text)

# 关闭套接字
udp_socket.close()
上一篇:离线部署Django工程项目迁移到无网络环境


下一篇:Pb协议的接口测试