Python Socket传输文件

发送端可以不停的发送新文件,接收端可以不停的接收新文件。

例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下;

接收端:

方法一:

#-*- coding: UTF-8 -*-
import socket,time,SocketServer,struct,os,thread
host=‘192.168.50.74‘
port=12307
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定义socket类型
s.bind((host,port)) #绑定需要监听的Ip和端口号,tuple格式
s.listen(1)

def conn_thread(connection,address):
    while True:
        try:
            connection.settimeout(600)
            fileinfo_size=struct.calcsize(‘128sl‘)
            buf = connection.recv(fileinfo_size)
            if buf: #如果不加这个if,第一个文件传输完成后会自动走到下一句
                filename,filesize =struct.unpack(‘128sl‘,buf)
                filename_f = filename.strip(‘\00‘)
                filenewname = os.path.join(‘e:\\‘,(‘new_‘+ filename_f))
                print ‘file new name is %s, filesize is %s‘ %(filenewname,filesize)
                recvd_size = 0 #定义接收了的文件大小
                file = open(filenewname,‘wb‘)
                print ‘stat receiving...‘
                while not recvd_size == filesize:
                    if filesize - recvd_size > 1024:
                        rdata = connection.recv(1024)
                        recvd_size += len(rdata)
                    else:
                        rdata = connection.recv(filesize - recvd_size)
                        recvd_size = filesize
                    file.write(rdata)
                file.close()
                print ‘receive done‘
                #connection.close()
        except socket.timeout:
            connection.close()

while True:
    connection,address=s.accept()
    print(‘Connected by ‘,address)
    #thread = threading.Thread(target=conn_thread,args=(connection,address)) #使用threading也可以
    #thread.start()
    thread.start_new_thread(conn_thread,(connection,address)) 

s.close()

方法二:

#-*- coding: UTF-8 -*-
import socket,time,SocketServer,struct,os
host=‘192.168.50.74‘
port=12307
ADDR=(host,port)

class MyRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print(‘connected from:‘, self.client_address)
        while True:
            fileinfo_size=struct.calcsize(‘128sl‘) #定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
            self.buf = self.request.recv(fileinfo_size)
            if self.buf: #如果不加这个if,第一个文件传输完成后会自动走到下一句
                self.filename,self.filesize =struct.unpack(‘128sl‘,self.buf) #根据128sl解包文件信息,与client端的打包规则相同
                print ‘filesize is: ‘,self.filesize,‘filename size is: ‘,len(self.filename) #文件名长度为128,大于文件名实际长度
                self.filenewname = os.path.join(‘e:\\‘,(‘new_‘+ self.filename).strip(‘\00‘)) #使用strip()删除打包时附加的多余空字符
                print self.filenewname,type(self.filenewname)
                recvd_size = 0 #定义接收了的文件大小
                file = open(self.filenewname,‘wb‘)
                print ‘stat receiving...‘
                while not recvd_size == self.filesize:
                    if self.filesize - recvd_size > 1024:
                        rdata = self.request.recv(1024)
                        recvd_size += len(rdata)
                    else:
                        rdata = self.request.recv(self.filesize - recvd_size)
                        recvd_size = self.filesize
                    file.write(rdata)
                file.close()
                print ‘receive done‘
        #self.request.close()

tcpServ = SocketServer.ThreadingTCPServer(ADDR, MyRequestHandler)
print(‘waiting for connection...‘ )
tcpServ.serve_forever()

发送端:

#-*- coding: UTF-8 -*-
import socket,os,struct
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((‘192.168.50.74‘,12307))
while True:

    filepath = raw_input(‘Please Enter chars:\r\n‘)
    if os.path.isfile(filepath):
        fileinfo_size=struct.calcsize(‘128sl‘) #定义打包规则
        #定义文件头信息,包含文件名和文件大小
        fhead = struct.pack(‘128sl‘,os.path.basename(filepath),os.stat(filepath).st_size)
        s.send(fhead)
        print ‘client filepath: ‘,filepath
        # with open(filepath,‘rb‘) as fo: 这样发送文件有问题,发送完成后还会发一些东西过去
        fo = open(filepath,‘rb‘)
        while True:
            filedata = fo.read(1024)
            if not filedata:
                break
            s.send(filedata)
        fo.close()
        print ‘send over...‘
        #s.close()
时间: 2024-11-10 15:18:07

Python Socket传输文件的相关文章

Java使用Socket传输文件遇到的问题(转)

1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题. 个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误. //---------------------------------------------------------------------------------------------------------

初试python多线程传输文件

新手!!求见谅!!望多指点 由于工作原因,试用期需要学习python,因为运维工作全都是由python完成,幸好有点python基础,知道什么是列表,元组,字符,字典什么的,要不然死翘翘的. 创建多线程主要的步骤有: 1.创建一个函数,这个函数是多线程需要多次运行的内容 2.利用for循环生成对应函数的多个成品(就是说这个函数已经赋予了需要的参数了,直接运行就可以的了) 3.利用for循环开始执行函数 4.利用for循环使主程序挂起,等待子进程完成后再执行其他动作 ---------------

python socket 进行文件上传下载

!/bin/python #coding:utf-8import SocketServerimport osimport datetimeimport MySQLdbclass mysql:def init(self):self.connect = MySQLdb.connect(host = '192.168.221.203',user = 'hall',passwd = '520157',port = 3306,db = 'info',charset = 'utf8')def mysql_c

Linux C++ TCP Socket传输文件或图片实例

环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服务器端建立连接.连接建立成功后,读取文件内容(/root/workspace/socket-picture/bizhi.jpg),发送给服务器端,服务器端新建new1.jpg文件,将接收到的文件内容保存到new1.jpg中,new1.jpg在当前目录下: Server.cpp 1 #include<

python post传输文件脚本

ps:背景,无法ssh相互访问机器(一般中间有堡垒机阻拦)的情况下,但是使用域名可以进行访问的情况下 可以使用http协议进行文件的上传. 服务器端代码(接受post的一端) #coding=utf-8 from BaseHTTPServer import BaseHTTPRequestHandler import cgi class   PostHandler(BaseHTTPRequestHandler):     def do_POST(self):         form = cgi.

Visual C++网络编程经典案例详解 第8章 网络文件传输 使用Socket传输文件 服务器代码 程序初始化

控件初始化状态使部分控件处于禁用状态代码禁用控件 BOOL CMyDlg::OnInitDialog(){ CDialog::OnInitDialog(http://www.amjmh.com); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDC_ABOUTBOX < 0xF000); CMenun* pSysMenu = GetSystemMenu(FALSE); ... //省略部分代码 SetIcon(m_hIcon

Python 的网络传输文件功能的设计与实现

摘要:Python 是目前较流行的程序设计语言之一,它具有简单易学代码简洁等特点,并且Python 提供了大量的功能库文件,开发大型应用程序时非常方便,广泛用于网站开发.游戏后台开发等方面.该文基Python 提供的网络编程库,开发了网络文件传输的功能,该功能可以快速有效地在互联网上进行文件的传输.1 Python 介绍Python是由Guido van Rossum在1989年底创造的,在1991年发行了第一个公开版本.Python是一种面向对象的.解释型的.动态数据类型的程序设计语言.Pyt

Java学习笔记——Socket实现文件传输

我越是逃离,却越是靠近你. 我越是背过脸,却越是看见你. 我从你开始, 我在你结束. 需求:实现局域网下socket传输文件. 客户端步骤: 1.建立与服务器的连接 2.创建client输出流 3.创建输入流,绑定本地文件 4.读取文件后输出给服务器 服务器端步骤: 1.启动服务器 2.创建accept输入流 3.创建输出流绑定本地文件 4.读取客户端信息写入本地文件 1.字节流传输文件. 1 public class Client { 2 3 public static void main(S

Python socket服务

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作. 1. 实现客户端发送字符,服务器返回大写的字符: 服务器: import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): # 通过类的继承,实现 def handle(self): # 重写父类的handle方法,所有的操作都在此方法中 while True: # 循环,不停的接收从客户端来的数