python socket文件通信练习

简介:

客户端发送文件,服务端接受。先上代码:

服务端:

#coding=utf-8

import socket
import threading
import time
import struct
def server_accept(newsock, address):
    FILEINFO_SIZE = struct.calcsize('128s1I')
    while 1:     
        try:
            fhead = newsock.recv(FILEINFO_SIZE)
            filename, filesize = struct.unpack('128s1I', fhead)
            filename=filename.strip('\00')
            filename=filename.decode('utf-8')
            print 'file name is :'+filename
            filename =u'recv_files/recv_'+filename
            fp = open(filename,'wb')
            restsize = filesize
            print "recving..."
            while 1:
                if restsize > 1024:#如果剩余数据包大于1024,就去1024的数据包
                    filedata = newsock.recv(1024)
                else:
                    filedata = newsock.recv(restsize)
                    fp.write(filedata)
                    break
                if not filedata:
                    break
                fp.write(filedata)
                restsize = restsize - len(filedata)#计算剩余数据包大小
                if restsize <= 0:
                    break
            fp.close()
            print "recv succeeded !"
        except:
            print "the socket partner maybe closed...waitting for annother..."
            newsock.close()
            break

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)#创建tcp连接
sock.bind(('115.156.249.32',9111))#定于端口和ip
print "server is start,bind 115.156.249.32:9111"
sock.listen(100)#监听
while True:
    try:
        newsock, address = sock.accept()
    except:
        print("server socket is down!")
        break

    print "connection to "+str(address)+" succeeded!"

    tmpThread = threading.Thread(target=server_accept,args=(newsock,address)) #如果接收到文件,创建线程
    tmpThread.start()#执行线程
print 'server is end'
客户端:

#coding=utf-8

import socket
import struct
import os

def client_upload(filename,ip,port):
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.settimeout(5)
    e=0
    try:
        sock.connect((ip,port))   
    except sock.settimeout,e:
        return '连接超时'
    except e:
        return '连接错误'
        
    FILEINFO_SIZE = struct.calcsize('128s1I')
    fpath,fname=os.path.split(filename)
    fhead = struct.pack('128s1I',str(fname),os.stat(filename).st_size)
    sock.send(fhead)
    fp = open(filename,'rb')
    while 1:
        data=fp.read(1024)
        if not data:
            break
        sock.send(data)
    print "sending over..."
    fp.close()
    sock.close()
    return False
        
wxPython图形界面:
#coding=utf-8
import wx
import time
import os
import re
import client

class myFrame(wx.Frame):
    def __init__(self,parent=None,
                 id=-1,pos=wx.DefaultPosition,
                 title='socket网络文件传输客户端'):
        size=(500,400)
        self.filename=''
        wx.Frame.__init__(self,parent,id,title,pos,size,
                          wx.DEFAULT_FRAME_STYLE^(wx.RESIZE_BORDER|wx.MAXIMIZE_BOX))
        self.Center()
        
        self.panel=wx.Panel(self)
        input_ipinfo=wx.StaticText(self.panel,-1,"输入服务器IP",(10,10))
        self.input_ip=wx.TextCtrl(self.panel,-1,"127.0.0.1",pos=(100,10),size=(200,-1))
        input_portinfo=wx.StaticText(self.panel,-1,"输入端口号",(320,10))
        self.input_port=wx.TextCtrl(self.panel,-1,"9111",pos=(400,10),size=(60,-1))
        btn_exit=wx.Button(self.panel,label="退出",pos=(300,60),size=(50,30))
        btn_open=wx.Button(self.panel,label="选择文件",pos=(100,60),size=(50,30))
        btn_upload=wx.Button(self.panel,label="上传文件",pos=(200,60),size=(50,30))
        btn_help=wx.Button(self.panel,label="帮助",pos=(400,60),size=(50,30))
        self.text_info=wx.StaticText(self.panel,-1,"请上传文件...",(10,90))
        
        self.Bind(wx.EVT_BUTTON,self.OnExitBtn,btn_exit)
        self.Bind(wx.EVT_BUTTON,self.OnOpenBtn,btn_open)
        self.Bind(wx.EVT_BUTTON,self.OnUploadBtn,btn_upload)
        self.Bind(wx.EVT_BUTTON,self.OnHelpBtn,btn_help)

        
    def OnOpenBtn(self,event):
        #创建标准文件对话框
        dialog = wx.FileDialog(self,"Open file...",os.getcwd(),style=wx.OPEN,wildcard="*.*")
        if dialog.ShowModal() == wx.ID_OK:
            self.filename = dialog.GetPath()
            if self.filename:
                self.ShowFile()
                self.text_info.SetLabelText(self.filename)
        #销毁对话框,释放资源.
        dialog.Destroy()
    
    def ShowFile(self):
        
        try:
            fd=open(self.filename,'r')
            fpath,ftype=os.path.splitext(self.filename)
            if ftype=='.jpg' or ftype == '.bmp' or ftype==".png":
                image1=wx.Image(self.filename,wx.BITMAP_TYPE_ANY)
 
                if image1.Height > 280:
                    image1.Rescale(image1.Width*300/image1.Height,280)   
                    #if image1.Width>480: 
                        #image1.Rescale(480,280)       
                tmp=image1.ConvertToBitmap()          
                self.content=wx.StaticBitmap(self.panel,id=-1,bitmap=tmp,pos=(10,120),size=(480,280))
            else:
                line=fd.read()
                self.content=wx.StaticText(self.panel,-1,line,(10,120),(400,280))
        except:
            self.content=wx.StaticText(self.panel,-1,'该文件不支持预览,请直接上传',(10,120),(400,280))
            fd.close()
    def OnUploadBtn(self,evnet):
        #验证ip地址
        dlg = wx.MessageDialog(None, 'ip 或端口不合法','提示', wx.CANCEL)  
        dlgfile=wx.MessageDialog(None, '请先选择文件!','提示', wx.CANCEL)
        if not self.filename:
            dlgfile.ShowModal()
            return 
        ip=self.input_ip.GetValue()
        port=self.input_port.GetValue()
        ipgroup=ip.strip().split('.')
        if len(ipgroup) !=4:
            dlg.ShowModal() 
            return
        for x in range(4):
            try:
                temp=int(ipgroup[x])
                port=int(port)
            except:
                dlg.ShowModal()
                return
            if temp>255 or temp<0 or port<1024 or port>65536:
                dlg.ShowModal()
                return
        upconnect=client.client_upload(self.filename,str(ip),port)
        if upconnect:
            dlgerr=wx.MessageDialog(None, upconnect,'提示', wx.CANCEL)
            dlgerr.ShowModal()
        
    def OnExitBtn(self,event):
        self.Close(True)
        
    def OnHelpBtn(self,event):
        dlgerr=wx.MessageDialog(None, '如果你连不是,不是程序问题,是服务端没开!','提示', wx.CANCEL)
        dlgerr.ShowModal()
        
class App(wx.App):
    def OnInit(self):
        
        image=wx.Image('author.png',wx.BITMAP_TYPE_PNG)
        bmp=image.ConvertToBitmap()
        wx.SplashScreen(bmp, wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,1000, None, -1)
        wx.Yield()
        time.sleep(1)
        
        self.frame=myFrame()
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True
 
def main():
    app=App()
    app.MainLoop()    

main()
    
        




相关文章
|
2月前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
21天前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
124 69
|
2天前
|
Shell 开发者 Docker
Python文件打包:一站式指南
本文深入探讨Python文件打包的各种方法,从基础的zip和tar工具到高级的setuptools、PyInstaller、cx_Freeze等,涵盖Docker镜像、虚拟环境及自包含可执行文件的打包方式。通过示例代码与详细解析,帮助开发者根据项目需求选择合适的打包方案,提升代码分发与部署效率。内容全面,适合各水平读者学习参考。
|
1月前
|
网络协议 Unix Linux
# 2个类轻松构建高效Socket通信库
本文介绍了一种通过两个类`EpollEventHandler`和`IEpollEvent`构建高效Socket通信库的方法。该库支持TCP、UDP和Unix域套接字,采用I/O多路复用技术(如epoll),提升并发处理能力。通过抽象基类和具体事件类的设计,简化了API使用,便于开发者快速上手。文章还提供了服务端与客户端的实例代码,展示其在实际项目中的应用效果。此Socket库适应嵌入式环境,功能定制性强,有助于减少外部依赖并提升维护效率。
66 13
# 2个类轻松构建高效Socket通信库
|
1月前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
83 10
|
1月前
|
存储 算法 文件存储
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
|
3月前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
85 20
|
3月前
|
存储 数据采集 数据处理
如何在Python中高效地读写大型文件?
大家好,我是V哥。上一篇介绍了Python文件读写操作,今天聊聊如何高效处理大型文件。主要方法包括:逐行读取、分块读取、内存映射(mmap)、pandas分块处理CSV、numpy处理二进制文件、itertools迭代处理及linecache逐行读取。这些方法能有效节省内存,提升效率。关注威哥爱编程,学习更多Python技巧。
119 8
|
3月前
|
存储 JSON 对象存储
如何使用 Python 进行文件读写操作?
大家好,我是V哥。本文介绍Python中文件读写操作的方法,包括文件读取、写入、追加、二进制模式、JSON、CSV和Pandas模块的使用,以及对象序列化与反序列化。通过这些方法,你可以根据不同的文件类型和需求,灵活选择合适的方式进行操作。希望对正在学习Python的小伙伴们有所帮助。欢迎关注威哥爱编程,全栈路上我们并肩前行。
103 4
|
3月前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。

热门文章

最新文章

下一篇
oss创建bucket