python学习——day8(socket,socket server) Alex网址:http://www.cnblogs.com/alex3714/articles/5227251.html(示例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习——day8(socket,socket server) Alex网址:http://www.cnblogs.com/alex3714/articles/5227251.html(示例相关的知识,希望对你有一定的参考价值。
一、socket
定义:
socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。
建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。
最简单的服务器端和客户端:
1 #服务器端 2 import socket 3 server=socket.socket(地址簇,套接字) #声明 4 5 server.bind(("localhost",9999)) #确定监听的端口 6 7 server.listen() #开始监听 8 9 conn,addr=server.accpet() #在服务器端生成实例并赋值 10 print("new conn:",addr) 11 12 while True: #服务器端循环接收数据 13 14 data=conn.recv(1024) #接受数据,最多1K 15 print(data) #>>b‘abc‘ 16 17 conn.send(data.upper) #将数据改为大写发回去
1 #客户端 2 import socket 3 4 client=socket.socket() #实例化 5 6 client.connect("localhost",9999) #绑定IP和端口 7 8 client.send(b"abc") #转为二进制发送 9 10 data=client.recv(1024) 11 12 print(data) 13 14 >>b‘ABC‘
小Tips:
地址簇:
AF.INET(IPV4,默认)
AF.ZNET6(IPV6)
AF.UNTX(local)
套接字:
socket.
SOCK_STREAM #for tcp
socket.
SOCK_DGRAM #for udp
解决各种问题版(数据过大一次传不完,粘包等):
1 #服务器端 2 import socket,os 3 server=socket.socket(地址簇,套接字) #声明 4 5 server.bind(("localhost",9999)) #确定监听的端口 6 7 server.listen() #开始监听 8 9 conn,addr=server.accpet() #在服务器端生成实例并赋值 10 print("new conn:",addr) 11 12 while True: #服务器端循环接收数据 13 14 data=conn.recv(1024) #接受数据,最多1K 15 data=data.decode() #二进制转成‘utf-8‘ 16 if no data : 17 print(‘客户端已断开‘) 18 break 19 print(‘执行指令:‘,data) 20 21 cmd_res=os.popen(data).read() #执行操作 22 23 conn.send(len(cmd_res).encode(‘utf-8‘)) #先发送数据的大小 24 25 time.sleep(0.5) #先睡0.5s 防止粘包(当然这很low),后面讲NB的 26 27 conn.send(cmd_res.encode(‘utf-8‘)) #将数据发回去 28 29 server.close() #我好像前面都忘写关闭了(anyway)
1 #客户端 2 import socket 3 4 client=socket.socket() #实例化 5 6 client.connect("localhost",9999) #绑定IP和端口 7 8 while True: 9 cmd = input(">>:").strip() 10 11 client.send(cmd.encode(‘utf-8‘)) 12 13 cmd_res_size=(client.recv(1024)).decode() #要传输的文件的大小 14 received_size=0 #本地已有的文件大小(断点续传,请看FTP作业) 15 received_data=b‘‘ 16 print("命令结果大小",cmd_res_size) 17 while received_size<cmd_res_size: 18 data=client.recv(1024) 19 received_data+=data 20 received_size+=len(data) 21 else: 22 print("数据接收完毕") 23 print(received_data.decode()) 24 25 client.close()
ftp_server:(详情看FTP作业)
1. 读取文件名
2. 检测文件是否存在
3. 打开文件
4. 检测文件大小
5. 发送文件大小给客户端
6. 等客户端确认
7. 开始边读边发数据
8. 发送md5
温习下加密:
1 import hashlib 2 3 m=hashlib.md5 4 5 m.updata(b‘abc‘) 6 m.updata(b‘123‘) 7 8 #m.updata(b‘abc123‘) #两者结果一毛一样,so可以采用这种方式读取文件计算md5值 9 10 print(m.hexdigest) #16进制
二、socket server
多线程满足条件:
1.你必须自己创建一个请求处理类,并且这个类要继承BaseRequestHandler,并且还有重写父亲类里的handle()
2.你必须实例化TCPServer ,并且传递server ip 和 你上面创建的请求处理类 给这个TCPServer
3.server.handle_request() #只处理一个请求
4.server.serve_forever() #处理多个一个请求,永远执行
1 import socketserver 2 3 class MyTCPHandler(socketserver.BaseRequestHandler): #条件1,自己创建一个类 4 def handle(self): #重写父类中的handle() 5 while True: 6 try: 7 self.data = self.request.recv(1024).strip() 8 print("{} wrote:".format(self.client_address[0])) 9 print(self.data) 10 self.request.send(self.data.upper()) 11 except ConnectionResetError as e: 12 print("err",e) 13 break 14 if __name__ == "__main__": 15 HOST, PORT = "localhost", 9999 16 # Create the server, binding to localhost on port 9999 17 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) #实例化ThreadingTCPServer,并传递(端口号+IP),和请求类名 18 server.serve_forever() #关闭
以上是关于python学习——day8(socket,socket server) Alex网址:http://www.cnblogs.com/alex3714/articles/5227251.html(示例的主要内容,如果未能解决你的问题,请参考以下文章
python基础学习日志day8-socket发送大数据包问题
python学习——day8(socket,socket server) Alex网址:http://www.cnblogs.com/alex3714/articles/5227251.html(示例