本节将介绍网络编程的一些基础知识后,调用Python socket模块分别创建一个服务端,一个客户端,使用户可以在右侧的实验环境中,在线观察到它们之间的通信过程是怎么样的,以及是如何通过代码实现的。
什么是Socket
Socket 在英文中的含义为“(连接两个物品的)凹槽”,通常我们把它理解为“插座”的意思。但在计算机科学中,Socket又称"套接字",是指一个连接的两个端点,这里的连接可以是同一机器上的,像unix socket,也可以是不同机器上的,像network socket。我们可以简单可以把socket看作是一种特殊的文件,一些socket函数对这个特殊文件进行的操作(读/写IO、打开、关闭),从而实现不同机器的网络连接实现。
网络连接又分 TCP 连接和 UDP 连接。TCP 连接是可靠的网络连接,通信双方均可以以流的方式发送数据,且发送方要保证接收方接收到数据。UDP 连接是无状态通信,无需真正建立连接,且发送方不保证接收方是否接收到数据。我们所接触到的网络连接通常都是 TCP 连接。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。在创建 TCP 连接时,主动发起连接的叫做客户端,被动响应连接的叫服务器。
实验
实验设计
TCP服务端程序流程
创建套接字,绑定套接字到本地IP与端口
开始监听连接
进入循环,不断接受客户端的连接请求
然后接收传来的数据,并发送给对方数据
传输完毕后,关闭套接字
TCP客户端程序流程
创建套接字,连接远端地址
连接后发送数据和接收数据
传输完毕后,关闭套接字
创建客户端脚本文件
cat > client.py << EOF
import socket
HOST = '127.0.0.1'
PORT = 30068
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect((HOST, PORT))
for data in [b'keinYe', b'Steven', b'Micheel']:
client.send(data)
print(client.recv(30068).decode('utf-8'))
client.close()
EOF
客户端工作流程:
客户端需要连接到服务器,首先需要知道该服务器的 IP 地址和端口号,我们将要编写的服务端程序的端口号为30068,因此这里设置为30068。客户端程序通过 connect 函数连接到的服务器,连接到服务器后通过 send 函数来发送数据,通过 recv 函数来接收数据。
创建服务端脚本文件
cat > server.py << EOF
import socket
import time
HOST = '127.0.0.1'
PORT = 30068
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)# 用来建立 socket 实例。
server.bind((HOST, PORT))#用来绑定 IP 和端口。
server.listen(1)#用来监听当前绑定 IP 和端口的连接时间。
conn, addr = server.accept() #用来获取客户端地址和当前连接的 socket。
print(addr)
with conn:
print('Connected by %s:%s' % addr)
while True:
time.sleep(1)#linsten(1) 表示同一时刻只接受一个客户端与连接到服务器,可修改该参数以接受多个客户端连接
data = conn.recv(1024)#用来从客户端接收收据
if not data:
break
conn.send(("Hello, %s" % data.decode('utf-8')).encode('utf-8'))#用来向客户端发送数据和
print('Disconnected %s:%s' % addr)
EOF
该服务端脚本文件绑定了在本机30068端口的服务端,用来接收客户端的连接,并将客户端发送过来的数据再回送回给客户端。每个客户端连接到该服务器是开启一个单独线程来处理通信事件。
客户端与服务器建立通信
将客户端和服务端连接并通信是检验代码是否正常工作的最好方法。单是需要注意的是在运行客户端之前要先将服务端运行起来。
我们先在右侧实验ssh区,执行以下命令
python3 server.py
然后点击实验区顶部的+号,选中open ssh,新建一个ssh连接,执行以下命令
python3 client.py
您需要在两个ssh窗口之间切换以观察客户端与服务器之间的通信过程。
您也可以手动修改代码,以观察代码的变化对通信过程的影响。
总结
使用Python socket模块进行网络编程非常简单,客户端指定服务端IP和端口后,连接即可。服务端监听指定端口,对每一个新的连接,创建一个线程或进程来处理。通常服务器程序会无限运行下去。通过本节的实践,相信用户用户可以通过右侧的在线实验环境,对python网络编程有了初步了掌握。