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)
posted @ 2016-09-08 17:17  Dus  阅读(351)  评论(0编辑  收藏  举报