zoukankan      html  css  js  c++  java
  • Python自动化之socket初识

    1. os.popen()

    • os.system(cmd)会直接输出命令的结果到屏幕上,返回一个状态码0或1。
    • os.popen(cmd)会返回一个<open file 'dir', mode 'r' at 0x016AD1D8> file read对象
    • 如果要读取返回的内容,os.popen(cmd).read()进行读取。

    2. subprocess(Python3)和commands(Python2)模块

    运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。
    subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

    Python2中是commands,到Python3中commands模块合并到了subprocess。

    3. socket编程思路

    TCP服务端:

    1. 创建套接字,绑定套接字到本地IP与端口

      socket.socket()
      s.bind()

    2. 开始监听连接
      s.listen()

    3. 进入循环,不断接受客户端的连接请求
      conn,addr = s.accept()

    4. 然后接收传来的数据,并发送给对方数据

      s.recv()
      s.sendall()

    5. 传输完毕后,关闭套接字
      s.close()

    TCP客户端:

    1. 创建套接字,连接远端地址

      socket.socket)
      s.connect()

    2. 连接后发送数据和接收数据

      s.sendall()
      s.recv()

    3. 传输完毕后,关闭套接字
      s.close()

    client端

    import socket
    ip_port = ("localhost",6999)
    
    sock_client = socket.socket()
    
    sock_client.connect(ip_port)
    
    while True:
    
        cmd = input(">>>>").strip()
        if not cmd:continue
        sock_client.sendall(bytes(cmd,encoding="utf-8"))
        data = sock_client.recv(1024)
        print(str(data,encoding="utf-8"))
    
    sock_client.close()
    

    server端

    import socket
    import subprocess
    
    
    ip_prort = ("localhost",6999)
    
    sock_client = socket.socket()
    
    sock_client.bind(ip_prort)
    
    sock_client.listen(1)
    conn, addr = sock_client.accept()
    
    while True:
    
    
    
        print("conn:---->",conn)
    
        print("addr:---->",addr)
    
        data = conn.recv(1024)
        # cmd_status,cmd_result = subprocess.getoutput(data)
        # if len(cmd_result) == 0:
        #     conn.sendall("Done")
        # else:
        print(data)
        conn.sendall(data.upper())
        # conn.sendall(bytes(str(data).upper(),encoding="utf-8"))
    conn.close()
    

    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #(创建对象)

    • 参数一,地址簇: AF_INET为ipv4地址; AF_INET6为ipv6地址; AF_UNIX只能用于单一的Unix系统连接;
    • 参数二,类型: SOCK_STREAM指tcp协议默认; SOCK_DGRAM指udp; SOCK_RAW原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以,而且SOCK_RAW也可处理特殊的IPv4报文,另利用原始套接字,可通过IP_HDRINCL套接字选项由用户构造IP头;
    • 参数三,协议: 0(默认,与特定的家族相关的协议,若是0系统会根据地址格式和套接类别自动选择一个合适的协议);
    • sock.bind(address) #(将套接字绑定到地址,address的格式取决于地址族,在AF_INET下,以tuple的形式表示地址(IP,port)
  • 相关阅读:
    oracle 进阶之model子句
    SiteMesh的使用--笔记
    JZ49:把字符串转换成整数
    面试题45:把数组排成最小的数
    面试题43:1~n整数中1出现的次数
    面试题42:连续子数组的最大和
    面试题41:数据中的中位数
    面试题40:最小的k个数
    面试题39:数组中出现次数超过一半的数字
    面试题38:字符串的排列
  • 原文地址:https://www.cnblogs.com/wspblog/p/5853795.html
Copyright © 2011-2022 走看看