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