zoukankan      html  css  js  c++  java
  • 第三十一天笔记

    客户端:

    from socket import *  调用socket模块,因为这里要用到socket大量的接口和属性,这样写可以简化代码不用加前缀

    import struct   调用struct模块

    import json

    client = socket(AF_INET, SOCK_STREAM)

    client.connect(('127.0.0.1', 8081))

    # 通信循环

    while True:    

    cmd=input('>>: ').strip()这句的用途是后面想输啥就输啥    

    if len(cmd) == 0:continue  这句的作用是用来防止空格传入空的数据    

    client.send(cmd.encode('utf-8'))      

    #1. 先收4bytes,解出报头的长度   

      header_size=struct.unpack('i',client.recv(4))[0]

        #2. 再接收报头,拿到header_dic    

    header_bytes=client.recv(header_size)    

    header_json=header_bytes.decode('utf-8')    

    header_dic=json.loads(header_json)    

    print(header_dic)    

    total_size=header_dic['total_size']

        #3. 接收真正的数据   

      cmd_res=b''    

    recv_size=0   

      while recv_size < total_size:        

    data=client.recv(1024)        

    recv_size+=len(data)        

    cmd_res+=data

    print(cmd_res.decode('gbk'))转成gbk编码把字符转成中文

    client.close()

    服务端: # 服务端必须满足至少三点:

    # 1. 绑定一个固定的ip和port

    # 2. 一直对外提供服务,稳定运行

    # 3. 能够支持并发

    from socket import *

    import subprocess

    import struct

    import json

    server = socket(AF_INET, SOCK_STREAM)这个套接字server负责接受链接请求,建立链接 server.bind(('127.0.0.1', 8081))绑定ip和端口 server.listen(5)监听了链接请求连接池限制请求数

    # 链接循环

    while True:    

    conn, client_addr = server.accept() 形成阻塞   

      print(client_addr)

       

    # 通信循环    

    while True:        

    try:          

       cmd = conn.recv(1024)  # cmd=b'dir'(接收数据的最大限制)            

    if len(cmd) == 0: break  # 针对linux系统           

      obj = subprocess.Popen(cmd.decode('utf-8'),执行系统参数,                                  

      shell=True,                                 

       stdout=subprocess.PIPE,把命令的正确和错误的结果放到管道里去                                  

      stderr=subprocess.PIPE                                    )           

      stdout = obj.stdout.read()读出结果            

    stderr = obj.stderr.read()            

    # 1. 先制作报头          

       header_dic = {                 'filename': 'a.txt',                 'md5': 'asdfasdf12123x1',                 'total_size': len(stdout) + len(stderr)             }           

      header_json = json.dumps(header_dic)         

        header_bytes = header_json.encode('utf-8')

               # 2. 先发送4个bytes(包含报头的长度)           

      conn.send(struct.pack('i', len(header_bytes)))(i的意思是整形 ,后面的数据长度)           

      # 3  再发送报头          

       conn.send(header_bytes)

                # 4. 最后发送真实的数据           

      conn.send(stdout)            

    conn.send(stderr)        

    except ConnectionResetError: 这个是用来错误处理,有这个就不会报错           

      break

        conn.close()断开链接

    server.close()

    数据想从客户端到服务端 先到客户端的操作系统再通过网线到服务端的操作系统,然后服务端的操作系统发信息会客户端, 客户端里的信息删除,最后服务端的操作系统在把信息传入服务端

    补充struct模块 import struct import json

    header_dic={                 'filename':'a.txt',                 'md5':'asdfasdf123123x1',                 'total_size':12312311111111111123             }

    header_json=json.dumps(header_dic)

    # print(header_json) header_bytes=header_json.encode('utf-8')转成utf-8格式 print(len(header_bytes))

  • 相关阅读:
    [转]C# ReportViewer报表 详解
    [转]Java NIO原理图文分析及代码实现
    [转]C#泛型编程
    [转]ASP.NET页面基本对象
    [转]C#中抽象类和接口的异同
    [转]Android进程间通信消息机制及IPC机制实现
    [转]左连接和右连接的区别
    [转]C# 4.0 新特性
    [转]UML类图java代码实现
    [转]Using The Entity Framework With WCF
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/9581486.html
Copyright © 2011-2022 走看看