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服务端:
-
创建套接字,绑定套接字到本地IP与端口
socket.socket()
s.bind() -
开始监听连接
s.listen() -
进入循环,不断接受客户端的连接请求
conn,addr = s.accept() -
然后接收传来的数据,并发送给对方数据
s.recv()
s.sendall() -
传输完毕后,关闭套接字
s.close()
TCP客户端:
-
创建套接字,连接远端地址
socket.socket)
s.connect() -
连接后发送数据和接收数据
s.sendall()
s.recv() -
传输完毕后,关闭套接字
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)
感谢关注