回顾
在《Python进阶记录之网络编程(三)》中,我们介绍了如何利用UDP server和UDP client实现简单的点对点聊天。今天我们讲一下与UDP协议相对应的另一种传输层协议——TCP协议。
TCP协议基本概念
TCP协议的全称是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,是同一层内除UDP协议外另一个重要的传输协议。
我们已经知道,UDP协议是一种无连接的协议,在通信开始之前,不需要建立相关的连接,只需要发送数据即可。但是TCP协议是面向连接的协议,在通信开始之前,一定要先建立相关的连接才能发送数据。这也是UDP协议和TCP协议的一个较大的区别。
与UDP协议类似,在Python中,我们仍然使用socket模块的socket( )方法创建基于TCP协议的Socket套接字。
创建基于TCP协议的套接字
TCP协议是基于字节流的传输层通信协议,因此Type参数需要设置成SOCK_STREAM。
创建TCP客户端程序
创建TCP客户端程序的步骤与创建UDP客户端程序的步骤有点类似,不同的是,由于TCP协议是面向连接的,在创建TCP客户端程序时需要在收发数据前首先做一个连接服务器的操作。创建TCP客户端程序的步骤如下:1、创建TCP客户端套接字。2、连接服务器。3、发送/接收数据。4、关闭套接字。
创建TCP客户端程序
Python中使用socket对象的connect( )方法帮助TCP客户端连接指定服务器,该方法接收一个元组,内容包括IP地址和端口号。这里使用的是我的本机IP和默认端口号,可以根据需要自行修改。
像介绍UDP协议时一样,我们仍然使用sokit网络通信调试助手来帮助我们进行测试。启动sokit网络通信调试助手,设置一个TCP server,在TCP Addr中填入IP地址,在Port中填入端口号,然后点击TCP Listen启动TCP server。
TCP客户端与服务端进行收发数据
待TCP server启动后,我们运行上述TCP客户端程序,就可以顺利进行发送/接收数据了。我们可以对比之前的UDP客户端程序代码,创建时只是多了一步连接服务器的步骤,这也是TCP协议与UDP协议的一大不同之处。
创建TCP服务端程序
和TCP客户端程序相比,创建TCP服务端程序会更复杂一些。与UDP服务端程序类似,TCP服务端程序首先也需要绑定一个端口号,同时,TCP服务端程序还需要监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。
创建TCP服务端程序
Python中使用socket对象的listen( )方法来监听端口,传入的参数表示等待连接的最大数量,传入5即表示等待连接的数量不能超过5。
运行该TCP服务端程序后,服务器就会打开固定端口(比如我们设置的端口为12345)监听,接下来,该程序会自动通过一个永久循环来接受来自客户端的连接,Python中使用socket对象的accept( )方法等待并返回一个客户端的连接。每成功监听到一个客户端连接,TCP服务端程序就会创建该Socket连接。由于服务端可能会有大量来自客户端的连接,所以,TCP服务端程序要能够区分一个Socket连接是和哪个客户端绑定的。我们使用两个变量来接收accept( )方法返回的当前连接客户端的套接字和客户端地址信息。
我们借助sokit网络通信调试助手,创建一个TCP client,输入Server IP和Port,Port中填入我们代码中指定的端口号,点击TCP Channel。连接后就可以给TCP服务端程序发送数据了。
TCP服务端接收客户端连接
需要注意的是,由于TCP服务端程序需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理。上述代码我们简化了程序,一次只能服务一个客户端,接收一条数据后就终止了程序,而实际开发中往往会借助进程或线程。
总结
以上内容介绍了TCP协议的基本概念以及使用Python创建简单的TCP客户端与TCP服务端程序,需要重点掌握TCP协议与UDP协议的区别,能够熟练创建基于TCP协议的客户端与服务端程序。