ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day25TCP和UDP协议_subprocess_struct

2021-07-10 11:34:05  阅读:158  来源: 互联网

标签:UDP struct recv subprocess day25TCP print data pack


day25

内容详细

1.TCP和UDP

  • TCP (Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:web浏览器;电子邮件、文件传输程序。

  • UDP(User Datagram Prolocol)不可靠的,无连接的服务,传输效率高(发送前时小),一对一,一对多,多对一,多对多,面向报文,静最大努力服务,无堵塞控制。使用UDP的应用:域名系统(DNS);视频流;IP语音。

2.subprocess

import subprocess

res=subprocess.Popen("dir",#指定命令名
                     shell=True,
                     stderr=subprocess.PIPE,
                     #错误输出
                     stdout=subprocess.PIPE,)
                     #接收系统返回的值
print(res.stdout.read().decode("gbk"))
#输出接收到的值以“gbk”

3.struct

import struct 
#i模式把123456压缩,四个字节,如果大于就报错
header_pack=struct.pack("i",123456)#压包
print(header_pack)
obj = struct.unpack("i",beader_pack)#解包
print(obj)

实例

客户端

import socket
import struct
sk = socket.socket()

sk.connect(('127.0.0.1',8008))

while 1:
   cmd = input("请输入命令:")
   sk.send(cmd.encode('utf-8')) # 字节
   if cmd=="":
       continue
   if cmd == 'exit':
       break

   # header_pack=sk.recv(4)
   # data_length=struct.unpack("i",header_pack)[0]
   # print("data_length",data_length)
   '''
  b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
   
   
  '''
   data_length=int(sk.recv(1024).decode("utf8"))
   print("data_length",data_length)

   recv_data_length=0
   recv_data=b""

   while recv_data_length<data_length:
       data=sk.recv(1024)
       recv_data_length+=len(data)
       recv_data+=data

   print(recv_data.decode("gbk"))


sk.close()

服务端

# by luffycity.com

import socket
import subprocess

server = socket.socket()

server.bind(('127.0.0.1',8008))

server.listen(5)

while True:
   print("server is working.....")
   conn,addr = server.accept()
   # 字节类型
   while True:
       # 针对window系统
       try:
           cmd = conn.recv(1024).decode("utf8") # 阻塞

           if cmd == b'exit':
               break

           res=subprocess.Popen(cmd,
                            shell=True,
                            stderr=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            )
           # print("stdout",res.stdout.read())
           # print("stderr",res.stderr.read().decode("gbk"))
           out=res.stdout.read()
           err=res.stderr.read()

           print("out响应长度",len(out))
           print("err响应长度",len(err))
           if err:
                import struct
                header_pack = struct.pack("i", len(err))
                conn.send(header_pack)
                conn.send(err)
           else:
                #构建报头
                import struct
                header_pack=struct.pack("i",len(out))
                print("header_pack",header_pack)
                # # 发送报头
                conn.send(str(len(out)).encode("utf8"))
                # 发送数据
                conn.send(out)




       except Exception as e:
           break


   conn.close()

 

day25

内容详细

1.TCP和UDP

  • TCP (Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:web浏览器;电子邮件、文件传输程序。

  • UDP(User Datagram Prolocol)不可靠的,无连接的服务,传输效率高(发送前时小),一对一,一对多,多对一,多对多,面向报文,静最大努力服务,无堵塞控制。使用UDP的应用:域名系统(DNS);视频流;IP语音。

2.subprocess

import subprocess

res=subprocess.Popen("dir",#指定命令名
                     shell=True,
                     stderr=subprocess.PIPE,
                     #错误输出
                     stdout=subprocess.PIPE,)
                     #接收系统返回的值
print(res.stdout.read().decode("gbk"))
#输出接收到的值以“gbk”

3.struct

import struct 
#i模式把123456压缩,四个字节,如果大于就报错
header_pack=struct.pack("i",123456)#压包
print(header_pack)
obj = struct.unpack("i",beader_pack)#解包
print(obj)

实例

客户端

import socket
import struct
sk = socket.socket()

sk.connect(('127.0.0.1',8008))

while 1:
   cmd = input("请输入命令:")
   sk.send(cmd.encode('utf-8')) # 字节
   if cmd=="":
       continue
   if cmd == 'exit':
       break

   # header_pack=sk.recv(4)
   # data_length=struct.unpack("i",header_pack)[0]
   # print("data_length",data_length)
   '''
  b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
   
   
  '''
   data_length=int(sk.recv(1024).decode("utf8"))
   print("data_length",data_length)

   recv_data_length=0
   recv_data=b""

   while recv_data_length<data_length:
       data=sk.recv(1024)
       recv_data_length+=len(data)
       recv_data+=data

   print(recv_data.decode("gbk"))


sk.close()

服务端

# by luffycity.com

import socket
import subprocess

server = socket.socket()

server.bind(('127.0.0.1',8008))

server.listen(5)

while True:
   print("server is working.....")
   conn,addr = server.accept()
   # 字节类型
   while True:
       # 针对window系统
       try:
           cmd = conn.recv(1024).decode("utf8") # 阻塞

           if cmd == b'exit':
               break

           res=subprocess.Popen(cmd,
                            shell=True,
                            stderr=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            )
           # print("stdout",res.stdout.read())
           # print("stderr",res.stderr.read().decode("gbk"))
           out=res.stdout.read()
           err=res.stderr.read()

           print("out响应长度",len(out))
           print("err响应长度",len(err))
           if err:
                import struct
                header_pack = struct.pack("i", len(err))
                conn.send(header_pack)
                conn.send(err)
           else:
                #构建报头
                import struct
                header_pack=struct.pack("i",len(out))
                print("header_pack",header_pack)
                # # 发送报头
                conn.send(str(len(out)).encode("utf8"))
                # 发送数据
                conn.send(out)




       except Exception as e:
           break


   conn.close()

 

标签:UDP,struct,recv,subprocess,day25TCP,print,data,pack
来源: https://www.cnblogs.com/fxy1024/p/14993439.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有