Python网络编程之socket基础语法

TCP/IP协议是一门非常古老的协议,我们在网络编程的时候,不可能花几个月时候去研究TCP/IP协议,socket就是网络编程的救星,由socket来提供一系列符合TCP/IP协议的接口,我们的应用程序只需要与socket交互,即可实现通过TCP/IP协议在网络中收发数据。需要注意的一点是,socket抽象层本身不负责收发数据,数据收发仍然是依赖四层模型中的传输层、网络层和链路层

Python Version: 3.5+

socket简介

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket和file的区别:

  • file模块是针对某个指定文件进行【打开】【读写】【关闭】
  • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

socket网络编程中的四层协议

下面是socket编程中的一个简单实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# server.py
import socket

ip_port = ('127.0.0.1', 5555)

# step 1: 创建socket套接字, 里面封装了通信协议
s = socket.socket()

# step 2: 绑定IP及端口号
s.bind(ip_port)

# step 3: 监听绑定的端口
s.listen(5)

# 等待客户端的连接

# step 4: 接受客户端的连接
conn, addr = s.accept()
# conn对象里封装了连接过来的这个客户端的通信线路信息
# 后期跟这个客户端的通信与交互都需要在conn这条通信线路上进行

# step 5: 接收消息
recv_data = conn.recv(1024)

# step 6: 发送消息
send_data = recv_data.upper()
conn.send(send_data)

# step 7: 断开连接
conn.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# client.py
import socket

ip_port = ('127.0.0.1', 5555)

# step 1: 创建socket套接字, 里面封装了通信协议
s = socket.socket()

# step 2: 连接服务端
s.connect(ip_port)

# step 3: 发送消息
send_data = "hello"
# 这里注意,和服务端不同的是,服务端找到对端是通过conn对象,而客户端是s对象
# 在Python3.x中,socket对象发送对象必须是字节类型(2.7中可以是字符串)
s.send(bytes(send_data, encoding='utf8'))

# step 4: 收消息
recv_data = s.recv(1024)
print(recv_data, "--->", type(recv_data), str(recv_data))

# step 5: 断开连接
s.close()

先启动server.py

在启动client.py

1
2
# 客户端终端回显
b'HELLO' ---> <class 'bytes'> b'HELLO'