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 >>bABC‘

小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(babc)    
 6 m.updata(b123)
 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

学习python:day8

python学习笔记day8socket网络编程

python基础学习日志day8-socket发送大数据包问题

python学习——day8(socket,socket server) Alex网址:http://www.cnblogs.com/alex3714/articles/5227251.html(示例