文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 03:10

关注

比如你在网络上跟网络机器人聊天,你发送数据到机器人(服务器),然后服务器反馈聊天数据信息给你。当然,机器人的回复还涉及机器学习,但简单的消息反馈涉及的就是套接字的知识。

而且,如果你直接将服务器配置为连接到其他应用的客户端,那么双向通信也可以实现。(比如QQ聊天)

简单的搭建服务器与客户端

既然已经了解了套接字的应用。下面,我们来实现一个简单的单向通信TCP/IP服务器与客户端。

服务器

服务器的原理如下:

首先创建一个套接字,TCP是面向流的套接字。故需要使用SOCK_STREAM。

然后使用bind()函数将套接字与服务器地址关联(因为我们只是在本地测试,直接将地址设置为127.0.0.1或者localhost,端口号为10000),当然你身边如果有2台电脑设备,可以直接替换局域网的IP地址

调用listen()函数将套接字设置为服务器模式,然后无限循环等待,参数为最大排队数

在循环中,调用accept()等待客户端的消息连接(当然,这里可以设置最大连接数,超过直接拒绝连接)。如果有客户端进行连接,那么accept()函数会返回一个打开的连接与客户端地址

指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据

通过sendall()进行回传客户端数据。

传回数据后,与当前的客户端通信就算完成了。需要使用close()进行清理

示例代码如下:

  1. import socket 
  2.  
  3. # 1.创建一个套接字, 
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  5. # 2.使用bind()函数将套接字与服务器地址关联 
  6. sock.bind(('localhost', 10000)) 
  7. # 3.调用listen()函数将套接字设置为服务器模式 
  8. sock.listen(1) 
  9.  
  10. while True
  11.     # 4.调用accept()等待客户端的消息连接 
  12.     # 如果有客户端进行连接,那么accept()函数会返回一个打开的连接与客户端地址 
  13.     connection, client_address = sock.accept() 
  14.     print("连接客户端地址:", client_address) 
  15.     try: 
  16.         # 5.指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据 
  17.         data = connection.recv(1024) 
  18.         print(data) 
  19.         if data: 
  20.             # 6.通过sendall()进行回传客户端数据。 
  21.             connection.sendall("已接受到数据".encode()) 
  22.         else
  23.             print("客户端没有发送数据,不需要传送数据"
  24.     finally: 
  25.         #7.需要使用close()进行清理 
  26.         connection.close() 

 客户端

实现客户端相对来说比服务器要简单的多,因为其不需要监听,只需要连接发送数据即可。客户端实现主要分为:

创建一个套接字

使用connect()函数连接到服务器

通过sendall()向服务器发送数据

通过recv()接受服务器传递回的数据

交互完成之后,使用close()清理

示例如下:

  1. import socket 
  2.  
  3. # 1.创建一个套接字, 
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  5. # 2.使用bind()函数将套接字与服务器地址关联 
  6. sock.connect(('localhost', 10000)) 
  7.  
  8. try: 
  9.     msg = b"Are you there?" 
  10.     # 3.通过sendall()向服务器发送数据 
  11.     sock.sendall(msg) 
  12.     # 4.通过recv()接受服务器传递回的数据 
  13.     data = sock.recv(1024) 
  14.     print(data.decode()) 
  15. finally: 
  16.     # 5.交互完成之后,使用close()清理 
  17.     sock.close() 

 运行之后,服务器与客户端交互效果如下:

create_connection(更简易的客户端)

连接服务器除了使用connect()函数之外,其实还有另一个函数create_connection()来连接服务器,它可以省略几个步骤。示例如下:

  1. import socket 
  2.  
  3. # 获取匹配开头字符串的所有属性值 
  4. def getConstants(prefix): 
  5.     return { 
  6.         getattr(socket, n): n 
  7.         for n in dir(socket) 
  8.         if n.startswith(prefix) 
  9.     } 
  10.  
  11. ipproto_str = getConstants("IPPROTO_"
  12. family_str = getConstants("AF_"
  13. type_str = getConstants("SOCK_"
  14.  
  15. sock = socket.create_connection(('127.0.0.1', 10000)) 
  16. print(ipproto_str[sock.proto]) 
  17. print(family_str[sock.family]) 
  18. print(type_str[sock.type]) 
  19.  
  20. try: 
  21.     msg = b"Are you there?" 
  22.     sock.sendall(msg) 
  23.     data = sock.recv(1024) 
  24.     print(data.decode()) 
  25. finally: 
  26.     sock.close() 

 运行之后,效果如下:

create_connection()函数的原理是使用getaddrinfo()函数查找候选连接的参数,并返回一个打开的socket。getaddrinfo()函数的讲解在上一篇socket库。

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯