1、socket的基础 tcp/ip
tcp ip 协议是主机接入互联网以及接入互联网互联两台主机通信互联标准
物理层:传输二进制
链路层:对二进制数进行分组 ,唯一标示一台主机
数据帧组成:包头:18个字节 原地址,目标地址,数据类型 , 数据:最大1500字节
网络层:跑的ip协议,可以让各个子网之间进行通信 ,标示两台主机的ip地址
传输层:tcp/tdp,标示端口号:应用程序
会话层:
表示层
应用层
![](https://images2015.cnblogs.com/blog/952201/201607/952201-20160709051713046-342290620.png)
soctet:就是对tcp/ip协议的封装
socket只是对要发送的数据进行处理,实际发送还是要背后的tcp,udp协议。
2、socket用法
![](https://images2015.cnblogs.com/blog/952201/201607/952201-20160709051822358-1439179421.png)
举个例子:
买手机
s= socket.socket()
绑定:
开机:
s.listen(5)
等待电话:
conn,addr = s.accept()
conn:就是一个服务端与特定的客户端之间建立的通信的线
addr:客户端地址
收消息
recv_data = conn.recv(1024)
发消息
send_data = recv_data.upper()
conn.send(send_data)
注意:
2.7 可发送 字符串
3.0以后要发比特流
服务端:
不用指定字符编码,因为客户端发过来的是比特流,所以客户端就返回比特流
3、socket多线程的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socketserver import subprocess class MyServer(socketserver.BaseRequestHandler): def handle(self): # print self.request,self.client_address,self.server self.request.sendall(bytes('欢迎致电 10086,请输入1xxx,0转人工服务.',encoding="utf-8")) while True: data = self.request.recv(1024) if len(data) == 0:break print("[%s] says:%s" % (self.client_address,data.decode() )) #self.request.sendall(data.upper()) cmd = subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) cmd_res =cmd.stdout.read() if not cmd_res: cmd_res = cmd.stderr.read() if len(cmd_res) == 0: #cmd has not output cmd_res = bytes("cmd has output",encoding="utf-8") self.request.send(cmd_res )