回顾
在Python进阶记录之网络编程(四)中,我们介绍了TCP协议的基本概念以及使用Python创建简单的TCP客户端与TCP服务端程序。今天我们讲一下如何利用TCP server和TCP client实现简单的点对点聊天。
创建TCP server程序
我们使用socket模块的socket( )方法创建一个socket对象,由于是基于TCP协议的,所以我们传入类型Type为SOCK_STREAM。无论是UDP协议还是TCP协议,相应的服务端的端口都必须是唯一的,因此我们通过调用socket对象的bind( )方法来指定服务端的端口号,同时指定IP地址为127.0.0.1。
通过上一节的内容,我们知道,TCP server代码与UDP server代码非常相似,不同的是,因为TCP协议是面向连接的,所以我们需要使用listen( )方法进行监听,并使用accept( )方法来获取连接的客户端套接字和地址信息。为了可以一直收发消息,我们使用while循环。这里我们仍然指定服务端首先接收客户端的消息,因此,我们需要首先接收数据。
在基于UDP协议的UDP服务端程序中,我们直接使用服务端套接字的recvfrom( )方法和sendto( )方法来进行消息的接收与发送,但是在基于TCP协议的服务端程序中,我们一般利用accept( )方法获取的客户端套接字来进行消息的接收与发送。recv( )方法获取消息,send( )方法发送消息。为了使程序能够正常终止,我们规定,当接收到“88”的信息时,服务端程序终止。
创建TCP client程序
创建TCP client程序比服务端程序要简单一点,我们仍然使用socket模块的socket( )方法创建一个socket对象,Type设置为SOCK_STREAM。由于要实现与我们刚刚创建的TCP服务端通信,因此设置要发送的地址需要指定与刚刚创建的TCP服务端绑定的地址信息保持一致,IP为“127.0.0.1”,端口号为“6666”,然后使用connect( )方法进行与指定服务端的连接。
同样地,我们使用while循环来保证TCP client程序可以一直收发消息。前面提到,我们指定服务端首先接收客户端的消息,所以客户端就需要首先发送消息。当发送的消息为“88”时,客户端程序终止,同时服务端接收到“88”消息后也终止,保证了两个程序的正常终止。
运行程序
我们之前使用UDP协议实现点对点聊天时,由于UDP协议是一种无连接的传输层协议,因此无论先运行服务端程序,还是先运行客户端程序,都是可以正常进行通信的。但是TCP协议是面向连接的,所以必须首先运行TCP server程序,启动服务端后,再运行TCP client程序。如果先运行TCP client,connect( )方法会由于找不到指定的服务而连接失败。
当TCP server和TCP client按顺序成功运行后,两者之间就可以进行通信了。我们的程序中指定由客户端首先发送消息,服务端接收消息后继续发送消息,直至客户端发送消息“88”后两个程序终止,程序运行结束。
TCP server运行结果如下所示。
TCP client运行结果如下所示。
至此,我们使用一个TCP server和一个TCP client实现了简单的点对点聊天。与之前基于UDP协议实现的点对点聊天一样,当前的聊天模式只能发一句收一句,这是因为我们当前的程序都是单线程阻塞的。可以利用我们之前介绍过的多进程和多线程内容,将发消息和收消息分别使用一个进程来保证收发消息互不影响。后续我们会介绍多进程和多线程的TCP服务端,到时候我们再来实现收发消息互不影响的点对点聊天。
总结
以上内容介绍了如何利用TCP服务端和客户端实现一个简单的点对点聊天,需要重点掌握基于TCP协议的服务端与客户端写法,区别基于UDP协议的服务端和客户端。感谢大家的支持与关注,欢迎一起学习交流~