【day29】python网络编程:socket套接字
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编码