Socket 套接字原理详解
socket 编程介绍
Socket编程封装了常见的TCP、UDP操作,可以实现非常方便的网络编程。
socket() 函数介绍
# socket.socket(family,type)
tcpSocket=socket.socket(AF_INET, SOCK_STREAM)
# family 地址系列应为 AF_INET(IPv4), AF_INET6(IPv6)
# type 套接字类型应为 SOCK_STREAM(默认值),SOCK_DGRAM
# SOCK_STREAM 是基于 TCP 的,有保障的(即能保证数据正确传送到对方)面向连接的 SOCKET,多用于资料传送。
# SOCK_DGRAM 是基于 UDP 的,无保障的面向消息的 socket,多用于在网络上发广播信息
在 Python 语言标准库中,通过使用 socket 模块提供的 socket 对象,可以在计算机网络中建立可以互相通信的服务器与客户端。在服务器端需要建立一个 socket 对象,并等待客户端的连接。客户端使用 socket 对象与服务器端进行连接,一旦连接成功,客户端和服务器端就可以进行通信了。在每次通信结束后,都需要使用 close() 方法关闭 Socket。
socket 对象的内置函数和属性
函数 | 功能 |
---|---|
s.bind() | 绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址。 |
s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
s.connect() | 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 |
s.recv() | 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。 |
s.send() | 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字 |
s.close() | 关闭套接字 |
s.recvfrom() | 接收UDP数据,与recv()类似,但返回值是data,address)。其中data是包含接收数据的字符 |
s.sendto() | 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发 |
UDP 编程介绍
UDP 协议时,不需要建立连接,只需要知道对方的 IP 地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP 传输数据不可靠,但它的优点是和 TCP比,速度快,对于不要求可靠到达的数据,就可以使用 UDP 协议。
创建 Socket 时,SOCK_DGRAM 指定了这个 Socket 的类型是UDP。绑定端口和 TCP 一样,但是不需要调用 listen() 方法,而是直接接收来自任何客户端的数据。recvfrom() 方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用 sendto() 就可以把数据用 UDP 发给客户端。
TCP编程介绍
面向连接的 Socket 使用的协议是 TCP 协议。TCP 的 Socket 名称是 SOCK_STREAM。 创建套接字 TCP 套接字,可以调用 socket.socket()。
在Python语言中创建Socket服务端程序,需要使用socket模块中的socket类。创建Socket服务器程序的步骤如下:
- 创建Socket对象
- 绑定端口号。
- 监听端口号。
- 等待客户端Socket的连接。
- 读取客户端发送过来的数据。
- 向客户端发送数据。
- 关闭客户端Socket连接。
- 监听端口号。
- 等待客户端Socket的连接。
- 读取客户端发送过来的数据。
- 向客户端发送数据。
- 关闭客户端Socket连接。
- 关闭服务端Socket连接。