服务端:
import socket
import subprocess
# from socket import *
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #这里规定用什么通信,以及什么协议通信,STREAM是TCP,DGRAM是UDP
# phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #加这个可以让系统尽快关闭使用过的端口
phone.bind(('127.0.0.10',8080)) #这里ip什么的要注意,不然老报错,尽量生僻一些。
phone.listen(5) #这里表示最多可以接收5个电话同时给我打电话
try:
while True:
path,addr=phone.accept() #
msg=path.recv(1024) #我这里最多可以接收1024个字节
print(msg.decode('utf-8'))
res=subprocess.Popen(msg,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)#subprocess自己获取的信息就是bytes
a=res.stdout.read()
b=res.stderr.read()
path.sendall(a+b) #先把a输出,再把b输出,直到把所有信息输出完毕。
except Exception:
path.close() #服务端先关闭通道
finally: #不管用户有没有突然关掉客户端引起服务端报错,都要执行关闭手机的操作。
phone.close()#然后关闭手机。。但是这样的话只可以通信一次,通信完毕直接关机,无法持续提供服务
客户端:
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.10',8080)) #先连服务端再发消息。
while True:
abc=input('>>> :')#如果用户输入为空的话会无法整场发送与接收,这时因为客户端或者服务端都会在发送信息时先发送到缓存里,交给
# 操作系统去调用tcp/ip协议,如果要发送的信息为空,那么操作系统会拒绝发送,也就是空消息无法发送,而服务端从自己的缓存里去取对
# 应的信息时,也是空,也就无法收到信息,形成两头都在等对方回信的状态。这里可以再用户输入的时候人为限制一下。
if abc: #如果abc有内容,才执行发送以及接收服务端给回来的反馈信息。
phone.send(abc.encode('utf-8'))
# phone.send('sbqusi'.encode('utf-8')) #如果循环这个会一直发送同一条信息的,最好用一个Input
data=phone.recv(1024)
print(data)
phone.close() #客户端关机就行了。
#这个程序依然有问题,因为此时通道只可以供一个用户端取使用,其余的用户需要等此用户断开链接,才可以从服务端收到反馈信息,这里涉及到
# 并发。