python socket文件通信练习

来源:互联网 发布:广州电脑锣编程培训 编辑:程序博客网 时间:2024/05/22 03:14

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

服务端:

#coding=utf-8import socketimport threadingimport timeimport structdef 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()            breaksock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)#创建tcp连接sock.bind(('115.156.249.32',9111))#定于端口和ipprint "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-8import socketimport structimport osdef 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-8import wximport timeimport osimport reimport clientclass 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()            




0 0
原创粉丝点击