socket的发展:AF_UNIX在本地使用文件访问。
AF_INET在网络中访问。
原理:建立在tcp、udp写一下,三次握手之后建立socket套接字
tcp协议下的socket套接字:
运行步骤:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
socket例子:
import socket #服务端
import subprocess
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #培训
phone.bind(('192.168.20.18',8086)) #选择身体区域
phone.listen(5) #选择最大数目
print('start...')
phone.accept() #等人
while True: #对接受到的消息做处理
conn,client_addr=phone.accept() #把客人的诉求和客人的身份记录在conn和client_addr本子上
print('=>',conn,client_addr) #输出给头目看
while True:
try: # 自己对conn本子中的客户诉求进行分析
cmd = conn.recv(1024) # 把客户的需求本中接到的信息用1024字节保存并装到cmd本子中
if not cmd: break
res = subprocess.Popen(cmd.decode('utf-8'), shell=True, # 用subprocess模块中的Popen方法处理cmd,并把cmd的返回输出重定向
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = res.stdout.read()
stderr = res.stderr.read() # 输出重定向后的结果
conn.send(stdout + stderr) # 用conn本子记录重定向后的输出结果,并用send方法传给客户端
except Exception:
break # 不能预料的错误走这里
conn.close() # 把conn本子关上
phone.close() #退休
#步骤:
# 服务端:建立方法(买手机、培训)>确定ip、port(绑定part)> 开始listen(确定最大连接数)》 等待accept(等待别人来)》
# 处理消息:把客户的需求保存到两个本子中》对需求本进行判断,并进行Popen处理,进行输出重定向
# 关闭本子、电话
#客户端:建立方法(卖手机、培训) 》 连接(买对方出的票) 》 对自己输入的cmd命令先进行判断。》在进行转码发送 》 把接受的回复进行读取 》 关闭电话
import socket #客户端
import subprocess
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #跟服务端对应,做一个相应的培训
phone.connect(('192.168.20.18',8086)) #买对方放出的固定地方的票
while True:
cmd = input('>>:').strip() #把客户端输入的信息装到cmd本中
print(cmd) #把cmd中的客户需求打印出来
if not cmd:break #如果cmd本中的客户需求不是非空,就break while循环
phone.send(cmd.encode('utf-8')) #把客户需求用encode编码成bytes,通过电话传给服务端
cmd_res=phone.recv(1024) #把从服务端接收的返回转进cmd_res本中
print(cmd_res.decode('gbk'))
phone.close()
小知识点:
字符编码:encode、decode、unicode(python内部表示用的编码)
encode:作用是将unicode编码转成其他编码的字符串:如str1.encode(‘gb2312’)表示将unicode的字符串转换成gb2312编码
decode:作用是将其他编码的字符串转成unicode字符串:如str1.decode(‘gb2312’)表示将gb2312的字符串转换成unicode编码