在python中,socket 模块为开发人员提供了底层网络接口,开发人员可以用socket模块实现底层的基本网络通信。Socket 模块提供了 UNIX 程序员所熟悉的基本网络服务(也称为 BSD API)。这个模块中提供了在构建 socket 服务器和客户机时所需要的所有功能。
这个 API 与标准的 C API 之间的区别在于它是面向对象的。在C中,socket描述符是从socket调用中获得的,然后会作为一个参数传递给BSD API函数。在Python中,socket 方法会向应用socket方法的对象返回一个socket对象。
以下是一篇利用socket模块传输文件的代码:
客户端(发送文件):
#!/usr/bin/python
#coding=utf-8import socket
import thread
import wxclass Sender():
def __init__(self):
self.__s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)def setIP(self,ip):
self.__ip = ip
self.__s.connect((self.__ip,9807))def sendMsg(self,s):
self.__s.send(s)class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,'聊天室客户端',size=(200,100))#实例化窗口
self.__p = wx.TextCtrl(self,pos = (10,10),size = (100,20)) #实例化文本框
self.__f = wx.TextCtrl(self,pos = (10,30),size = (100,20)) #实例化文本框
self.__p.SetValue('127.0.0.1')
#self.__m = wx.TextCtrl(self,pos = (10,60),size = (100,300))
l = wx.Button(self,label='连接',pos = (120,10),size = (50,20))#实例化按钮
b = wx.Button(self,label='发送',pos = (120,30),size = (50,20))#实例化按钮
self.Bind(wx.EVT_BUTTON, self.OnLog, l)
self.Bind(wx.EVT_BUTTON,self.OnSend,b)#绑定事件
self.__s = Sender()
def OnLog(self,event):
self.__s.setIP(self.__p.GetValue())def OnSend(self,event):#定义一个按钮事件
f = file(self.__f.GetValue(),'r')
self.__s.sendMsg(f.read())
f.close()class MyApp(wx.App): #定义wx.App的子类
def OnInit(self): #
frame = MyFrame()
frame.Show()
return Trueapp = wx.App()
app.MainLoop()服务器端(接收文件):
#!/usr/bin/python
#coding=utf-8
##@Author 张亚军
##@Date 2012-10-30import socket
import times = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',9807))#监听本地端口
s.listen(3)while True:
conn,addr = s.accept()
while True:
data = conn.recv(8192)
if not data:
break
f = file('D:\\data\\'+str(time.time())+'.txt','w')
f.write(data)
f.flush()
f.close()
print '成功's.close()
主要思想就是在客户端把文件读成字符串,发送到服务器端之后服务器把得到的字符串写入文件