当前位置: 首页 > 科技观察

socket库:Python实现TCP-IP客户和服务器通信

时间:2023-03-12 11:14:47 科技观察

Socket库:Python实现TCP/IP客户端和服务器之间的通信比如你在网上和一个网络机器人聊天,你向机器人(服务器)发送数据,然后服务器将聊天数据信息反馈给你。当然,机器人的回复也涉及到机器学习,只是简单的消息反馈涉及到sockets的知识。此外,如果将服务器直接配置为连接其他应用程序的客户端,则双向通信也是可能的。(比如QQ聊天)既然已经了解了sockets的应用,就简单的搭建一个server和client。接下来,让我们实现一个简单的单向通信TCP/IP服务器和客户端。服务器server的原理如下:1.首先创建一个socket,TCP是面向流的socket。因此,需要使用SOCK_STREAM。2、然后使用bind()函数将socket与服务器地址相关联(因为我们只是在本地测试,直接设置地址为127.0.0.1或者localhost,端口号为10000),当然如果有2身边的电脑设备,可以直接替换局域网的IP地址3.调用listen()函数设置socket为server模式,然后无限循环等待,参数为最大队列数4.在循环,调用accept()等待客户端的消息连接(当然这里可以设置最大连接数,超过直接拒绝连接)。如果有客户端连接,accept()函数会返回一个打开的连接和客户端地址5.指定一个缓冲区存放recv函数接收到的数据6.通过sendall()发送回客户端数据。7、数据返回后,完成与当前客户端的通信。您需要使用close()清理示例代码,如下所示:importsocket#1。创建套接字,sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2。使用bind()函数将套接字连接到服务器地址关联sock.bind(('localhost',10000))#3。调用listen()函数将套接字设置为服务器模式sock.listen(1)whileTrue:#4。调用accept()等待客户端的消息连接#如果有客户端连接,accept()函数会返回一个打开的连接,带有客户端地址连接,client_address=sock.accept()print("连接客户端地址:",client_address)尝试:#5。指定一个缓冲区,用于存放recv函数接收到的数据data=connection.recv(1024)print(data)ifdata:#6。通过sendall()返回客户端数据。connection.sendall("数据已收到".encode())else:print("客户端未发送数据,无需传输数据")finally:#7.需要用close()来清理connection.close()client客户端在客户端的实现相对于服务端来说要简单一些,因为不需要监听,只需要连接发送数据即可。客户端实现主要分为:1、创建socket2、使用connect()函数连接服务器3、通过sendall()向服务器发送数据4、通过recv()接受服务器传回的数据)5.交互完成后,使用close()清理示例如下:importsocket#1。创建套接字,sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#2。使用bind()函数将套接字与服务器地址相关联sock.connect(('localhost',10000))try:msg=b"Areyouthere?"#3。通过sendall()sock.sendall(msg)#4向服务器发送数据。接受服务器通过recv()传回的数据Datadata=sock.recv(1024)print(data.decode())finally:#5.交互完成后,使用close()清理sock.close()运行后,服务端与客户端的交互如下:create_connection(更多简单客户端使用connect()函数)连接服务器,其实还有一个函数create_connection()连接服务器,可以省略几个步骤。例子如下:importsocket#获取所有匹配开头字符串的属性值")family_str=getConstants("AF_")type_str=getConstants("SOCK_")sock=socket.create_connection(('127.0.0.1',10000))print(ipproto_str[sock.proto])print(family_str[sock.family])print(type_str[sock.type])try:msg=b"Areyouthere?"sock.sendall(msg)data=sock.recv(1024)print(data.decode())finally:在运行sock.close(),效果如下:create_connection()函数的原理是利用getaddrinfo()函数找到候选连接的参数,返回一个打开的socket。getaddrinfo()函数在前面的socket库中有说明。