热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python网络编程基本应用

Python提供了两个级别访问的网络服务:低级别的网络服务支持基本的Socket,它提供了标准的BSDSocketsAPI,可以访问底层操作系统Socket接口的全部方法。高级别的

Python 提供了两个级别访问的网络服务:



  • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。

  • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。




什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。


简单实例


服务端

我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(8080)

接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。

1 #服务端代码
2 import socket
3 import subprocess
4 import struct
5 import json
6
7 phOne= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
8 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 重复使用端口
9 phone.bind(('127.0.0.1', 8080))
10 phone.listen(5)
11 print('start...')
12 while True:
13 coon, client_add = phone.accept()
14 print(client_add)
15 while True:
16 try:
17 cmd = coon.recv(1024)
18 if not cmd:
19 break
20 obj = subprocess.Popen(
21 cmd.decode('utf-8'),
22 shell=True,
23 stdout=subprocess.PIPE,
24 stderr=subprocess.PIPE)
25 stdout = obj.stdout.read()
26 stderr = obj.stderr.read()
27 # 1.制作固定长度报头
28 header_dic = {
29 'filename': 'a.txt',
30 'md5': 'soigiojalks',
31 'total_size': len(stdout) + len(stderr)
32 }
33 header_json = json.dumps(header_dic)
34 header_bytes = header_json.encode('utf-8')
35 # 发送报头长度
36 coon.send(struct.pack('i', len(header_bytes)))
37 # 2.把报头发送给客户端
38 coon.send(header_bytes)
39 # 3.发送真实数据
40 coon.send(stdout)
41 coon.send(stderr)
42 except ConnectionResetError:
43 break
44 coon.close()
45 phone.close()

客户端

接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 8080。

socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端获取数据,记住,操作完成后需要关闭连接。

完整代码如下:

1 # 客户端
2 import json
3 import socket
4 import struct
5
6 phOne= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7 phone.connect(('127.0.0.1', 8080))
8 while True:
9 cmd = input('>>').strip()
10 if not cmd:
11 continue
12 phone.send(cmd.encode('utf-8'))
13 # 1.接收报头
14 header = phone.recv(4)
15 # 2.从报头中解析真实数据描述信息(报头长度)
16 header_size = struct.unpack('i', header)[0]
17 header_bytes = phone.recv(header_size)
18 header_json = header_bytes.decode('utf-8')
19 header_dic = json.loads(header_json)
20 print(header_dic)
21 total_size = header_dic['total_size']
22 recv_size = 0
23 recv_data = b''
24 while recv_size < total_size:
25 res = phone.recv(1024)
26 recv_data += res
27 recv_size += len(res)
28 print(recv_data.decode('utf-8'))
29 phone.close()

此代码已解决粘包问题!!!


网络编程常见面试题:

1.python中,网络编程有哪些常用模块?

2.socket对象内建方法有哪些?

3.HTTP是什么?它与HTTPS有什么区别?

4.说说HTTP请求报文与响应报文格式。

5.TCP为什么会粘包?


原文链接:https://www.cnblogs.com/FiveStars/p/15158516.html



推荐阅读
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了协程的概念和意义,以及使用greenlet、yield、asyncio、async/await等技术实现协程编程的方法。同时还介绍了事件循环的作用和使用方法,以及如何使用await关键字和Task对象来实现异步编程。最后还提供了一些快速上手的示例代码。 ... [详细]
  • Window10+anaconda+python3.5.4+ tensorflow1.5+ keras(GPU版本)安装教程 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • python3+tkinter实践历程(四)——模仿CRT完成基于socket通信与tkinter的TCP串口客户端
    python3tkinter实践历程(四)——基于socket通信与tkinter的TCP串口客户端(仿CRT)文章目录系列文章目录分享背景制作背景最终功能工具截图展示代码详解系列 ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
author-avatar
书友67696238
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有