• socket


    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

    socket和file的区别:

    • file模块是针对某个指定文件进行【打开】【读写】【关闭】
    • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

    运用socket()实现文件上传:

    服务端在发送数据之前,先把发送数据的长度告诉客户端,要发送多少数据,然后客户端根据这个数据的长度循环接收来解决粘包,传输过程:
    服务端:
    (1).send #数据长度
    (4).recv #收到确认信息,开始下一步发送
    send #发送数据

    客户端 :
    (2).recv #获取数据长度
    (3).send #发送确认信息
    recv #循环接收
    服务端:

    #coding:utf-8
    import os,sys
    
    import json,socket
    
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    ip = ('localhost',10245)
    server.bind(ip)
    server.listen(5)
    conn,addr = server.accept()
    
    recv_size = 0   #用于计算我们已经接收文件大小
    recv_file = b'' #用于以二进制的方式存储文件
    
    msg_info = json.loads(conn.recv(1024))
    if msg_info.has_key("ack_msg"): #判断我们首次发送过来的的数据头中有没有ack_msg的key
        file_size = msg_info["ack_msg"]["file_size"]
        conn.send("start")
        while recv_size<file_size:
            
            content = conn.recv(1024)
            recv_size += 1024        #每接收一次文件内容,让我们的已接受文件大小+1024
            recv_file += content
        else:
            with open("C:UsersissuserDesktopindex2.html","ab+") as f:
                f.write(content)
                print u"传输完成了。。。"
    
    
    
    

    客户端:

    #!/user/bin/env python
    #coding:utf-8
    import socket
    import json
    import os
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    ip  = ('127.0.0.1',10245)
    print type(ip)
    client.connect(ip)
    
    file_path = "C:UsersissuserDesktopindex.html"
    file_name = os.path.basename(file_path)
    with open(file_path,"rb") as f:
            content = f.read()
            file_size = len(content)
    
    ack_msg = {"ack_msg":{"file_name":file_name,"file_size":file_size}}
    client.send(json.dumps(ack_msg))
    ack = client.recv(1024)
    if ack == "start":
            client.send (content)
    
    client.close()
    
    

    运用socket()实现文件分发:

    服务端:

    #coding:utf-8
    import yaml,json,SocketServer
    
    class MyHandler(SocketServer.BaseRequestHandler):
        def setup(self):
            with open('properties') as f:
                cfg = yaml.load(f.read())
                self.cfg = cfg
    
        def handle(self):
            conn  = self.request  #客户端连接的对象
            print '有客户端连接上了'
            if conn.recv(1024)=='successful':
                with open(self.cfg['filepath']['filepaths']) as f:
                    content =f.read()
                    print content
                    filesize = len(content)
                    print filesize
                    data = json.dumps({'filesize':filesize})
                    conn.send(data)
            if conn.recv(1024)=='start':
                conn.send(content)
            finish_msg = conn.recv(1024)
            print finish_msg
        def finish(self):
            print "finish"
    if __name__ == "__main__":
        ip = ('localhost',9999)
        server = SocketServer.ThreadingTCPServer(ip,MyHandler)
        server.serve_forever()
    

    客户端:

    #coding:utf-8
    import  json,socket
    import sys,time
    
    client = socket.socket()
    ip = ('localhost',9999)
    for i  in range(3):
        try:
            client.connect(ip)
            break
        except Exception  as e:
           print "连接失败了"
           time.sleep(3)
    else:
        sys.exit('重连3次失败,系统退出')
    
    
    client.send("successful")
    
    data = client.recv(1024)
    if data in 'filesize':
        filesize = data.get('filesize')
    
        client.send('start')
    recv_size = 0
    recv_file = b''
    
    while recv_size <recv_size:
        content = client.recv(1024)
        recv_size+=1024
        recv_file+=content
    else:
        with open('C:UsersAdministratorDesktopconfig.py','wb+')as f:
            f.write(recv_file)
    client.send("传送完成")
    
    
  • 相关阅读:
    Java读取压缩文件信息
    中国菜刀 一句话木马
    java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
    Hadoop搭建全程
    instr模糊查询使用及注意事项
    idea离线安装SonarLint
    Previous operation has not finished; run 'cleanup' if it was interrupted] 的排错过程
    vue中excel文件上传总结
    IDEA 2019.1离线安装lombok
    @Data注解失效解决办法
  • 原文地址:https://www.cnblogs.com/flyhgx/p/6690068.html
Copyright © 2020-2023  润新知