激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python Socket傳輸文件示例

Python Socket傳輸文件示例

2020-09-17 14:33愛做夢的魚 Python

這篇文章主要介紹了Python Socket傳輸文件示例,發送端可以不停的發送新文件,接收端可以不停的接收新文件。有興趣的可以了解一下。

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

例如:發送端輸入:e:\visio.rar,接收端會默認保存為 e:\new_visio.rar,支持多并發,具體實現如下;

接收端:

方法一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#-*- 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()

方法二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#-*- 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()

發送端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#-*- 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()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/dreamer-fish/p/5501924.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久国产精品二区 | 最近中文字幕一区二区 | 色吧久久| 无码av女优 | 9191久久久久视频 | 色综合久久久久久久久久 | 中文字幕在线播放不卡 | 在线观看日韩av电影 | 曰批全过程40分钟免费视频多人 | 噜噜噜影院 | 最新日韩在线观看视频 | 日本成年网 | 免费国产成人高清在线看软件 | 在线播放黄色网址 | 免费观看亚洲视频 | 欧美大逼网 | 日韩av电影在线免费观看 | 春光影院理论片 | 亚洲综合无码一区二区 | 国产午夜精品理论片a级探花 | 成人黄色小视频在线观看 | 99精品在线观看 | 日本高清电影在线播放 | 视频久久免费 | 免费嗨片首页中文字幕 | 激情大乳女做爰办公室韩国 | 欧美成人国产va精品日本一级 | 黄网站免费在线看 | 成人午夜一区二区 | 国产日本在线播放 | 色人阁五月天 | 久久免费精品 | 老女人碰碰在线碰碰视频 | 午夜视频免费在线观看 | 国产在线精品一区二区 | www.com超碰 | 久久国产28 | 手机免费看一级片 | 欧美国产一区二区三区 | 91 在线视频观看 | 成人一区久久 |