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()
最后更新:2017-04-03 12:55:38