客户端发送文件,服务端接受。先上代码:
服务端:
#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 FalsewxPython图形界面:
#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()