码迷,mamicode.com
首页 > 编程语言 > 详细

python_way ,day9 socket 和soctet多线程的使用

时间:2016-07-09 07:06:58      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

1、socket的基础 tcp/ip 

tcp ip 协议是主机接入互联网以及接入互联网互联两台主机通信互联标准
 
 
物理层:传输二进制
链路层:对二进制数进行分组  ,唯一标示一台主机
              数据帧组成:包头:18个字节 原地址,目标地址,数据类型 ,   数据:最大1500字节
 
网络层:跑的ip协议,可以让各个子网之间进行通信  ,标示两台主机的ip地址
传输层:tcp/tdp,标示端口号:应用程序
会话层:
表示层
应用层
 
技术分享

 

soctet:就是对tcp/ip协议的封装
socket只是对要发送的数据进行处理,实际发送还是要背后的tcp,udp协议。
 
 

2、socket用法

技术分享

举个例子:

买手机
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多线程的使用

技术分享

 

技术分享
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 )
socket多线程

 

 

 

 

 

python_way ,day9 socket 和soctet多线程的使用

标签:

原文地址:http://www.cnblogs.com/python-way/p/5655108.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!