温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Python中使用socket 套接字实现通信

发布时间:2021-04-19 17:44:43 来源:亿速云 阅读:179 作者:Leah 栏目:开发技术

这期内容当中小编将会给大家带来有关怎么在Python中使用socket 套接字实现通信,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Python主要用来做什么

Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

1. socket 在操作系统中它是处于应用层与传输层的抽象层,它是一组操作起来非常简单的接口(接收数据的),此接口接受数据之后交个操作系统

那么为什么?直接给操作系统不是更方便吗?那么你就想错了

因为操作系统的接口远比我们想象的要丑陋复杂,使用操作系统交换数据,非诚繁琐,,开发者们只能想办法让一个中间人和他们打交道,来简单的实现数据交换,那么就是socket套接字.它的作用就是:与操作系统之间数据交换将这些繁琐的操作,进行高度化封装,和简化,

2.我们能够用它实现简单的通信

在Python中有一个简单的内置socket 模块我们可以用它实现简单的基于TCP协议的通信

 #基于切换连接的循环通信  import socket #首先我们在文件中导入socket 模块  phone = socket.socket() #实例化一个对象  phone.bind(('127.0.01',8765))#bind是存放ip地址的(这里存放的是本地的IP地址)  phone.listen(5)#可以设置连接的个数,  while 1:#循环等待连接   conn,adds = phone.accept()   while 1:#要循环聊天我们要重复接收发送    try: #异常处理     receives_commands = conn.recv(1024) #接收命令请求,最多接收1024字节当然你也可以调整     receivse_commands = receives_commands.decode('utf-8')#网络传输是以字节的形势的所以我们要进行解码     print(f'来自客户端的消息{receives_commands}') #打印消息     if receives_commands.upper(0 == 'Q':break #正常结束     dispatch_orders = inport('请输入:').strip().encode('utf-8')     conn.send(dispatch_orders)    except ConnectionResetError:#客户端异常结束     print('客户端终端')     break   conn.close() #关闭连接  phone.close#关闭服务端  #客户端  import socket  phone = socket.socket()  phone.connect(('127.0.01',8765))  #连接服务端地址     while 1:        dispatch_orders = inport('请输入:').strip().encode('utf-8')#发送请求   if not dispatch_orders:print('不能为空')#不能为空   phone.send(dispatch_orders)  #发送         if dispatch_orders.upper() ==b'Q':#正常退出    break   receives_commands = phone.recv(1024)#接收服务端的回执   receives_commands = receives_commands.decode('utf-8')#解码   print(f'来自客户端的消息{receives_commands}') #打印          phone.close()#关闭客户端

那么我们就通过socket实现了一个简单的通信链接循环

其中我们需要注意的是:

1.阻塞 accept 和recv 当服务器和客户端都属于同种类阻塞时,那么谁都是同步接受或同步发送的状态那么是处于静止的,这样是不合理的(就是bug)

2.当我们设计时我们需要知道发送不能为空,不然服务端是接收不到消息的所以我们设置一个判断
有时我们会发现当我们接受的超过1024字节会发生什么?

那么下面我们就来将回答下这个问题:

下面我们引入一个操作系统的模块

Python中 subprocess 模块就是用来和cmd 命令行进行交流的模块

 obj = subprocess.Popen('dir',#实例化对象括号内第一个参数就是我们的cmd命令行的命令,这里我们写的是dir显示文件夹中内容          shell=True,          stdout=subprocess.PIPE,          stderr=subprocess.PIPE,          )    print(obj.stdout.read().decode('gbk')) # 正确命令    print(obj.stderr.read().decode('gbk')) # 错误命令

那么我们在这个基础上建立一个服务端响应客户端命令的机制

import socket import subprocess phone = socket.socket() phone.bind(('127.0.01',8695)) phone.listen(5) while 1:  conn,adds = phone.accept()  while 1:   try:    receives_commands = conn.recv(1024)    if receiver_commands ==b'Q':break     #obj = subprocess.Popen(Receiving_instructiors,          # shell= True,        #stdout = subprocess.PIPE,        #stderr = subprocess.PIPE          )   obj = subprocess.Popen(receives_commands.decode('utf-8')#动态的传入命令        shell = True        stdout = subprocess.PIPE        stderr = subprocess.PIPE         )  # print(obj.stdout.read().decode('gbk')) # 正确命令  # print(obj.stderr.read().decode('gbk')) # 错误命令   ret = obj.stodut.read()+obj.stderr.read()#将产生的内容进行拼接   conn.send(ret)  except ConnectionResetError:    print('客户端终端')    break   conn.close() phone.close() import socket phone = socket.socket() phone.connect(('127.0.01',8695)) while 1:  dispatch_orders = inport('请输入命令:').strip().encode('utf-8')  if not dispatch_orders:print('输入不能为空')  phone.send(dispatch_orders)  if dispatch_orders.upper() ==b'Q':break  receives_commands = phone.recv(1024)  receives_commands = receives_commands.decode('utf-8')  print(f'来自客户端的消息{receives_commands}') phone.close()

上述就是小编为大家分享的怎么在Python中使用socket 套接字实现通信了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI