如何使用Python socket
使用socket模块建立网络通讯
编写代码
- 网络通讯服务器
# coding:utf-8
#
import Tkinter
import threading
import socket
class ListenThread(threading.Thread):
def __init__(self, edit, server):
threading.Thread.__init__(self)
self.edit = edit
self.server = server
def run(self):
while 1:
try:
client, addr = self.server.accept()
self.edit.insert(Tkinter.END,"connect from:%s:%d\n" % addr)
data = client.recv(1024)
self.edit.insert(Tkinter.END,"receive from:%s\n" % data)
client.send("I GOT: %s" %data)
client.close()
self.edit.insert(Tkinter.END,"close client\n")
except:
self.edit.insert(Tkinter.END,"close client\n")
break
class Control(threading.Thread):
def __init__(self, edit):
threading.Thread.__init__(self)
self.edit = edit
self.event = threading.Event()
self.event.clear()
def run(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("",1051))
server.listen(1)
self.edit.insert(Tkinter.END, "Waiting For Connection\n")
self.lt = ListenThread(self.edit,server)
self.lt.setDaemon(True)
self.lt.start()
self.event.wait()
server.close()
def stop(self):
self.event.set()
class Window:
def __init__(self, root):
self.root = root
self.butlisten = Tkinter.Button(root, text = "Start Listening", command = self.Listen)
self.butlisten.place(x = 20, y = 15)
self.butclose = Tkinter.Button(root, text = "Stop Listen", command = self.Close)
self.butclose.place(x = 120, y = 15)
self.edit = Tkinter.Text(root)
self.edit.place(y = 50)
def Listen(self):
self.ctrl = Control(self.edit)
self.ctrl.setDaemon(True)
self.ctrl.start()
def Close(self):
self.ctrl.stop()
root = Tkinter.Tk()
window = Window(root)
root.mainloop()
2. 网络通讯客户端
# coding:utf-8
#
import Tkinter
import socket
class Window:
def __init__(self, root):
label1 = Tkinter.Label(root, text = 'IP')
label2 = Tkinter.Label(root, text = 'Port')
label3 = Tkinter.Label(root, text = 'Data')
label1.place(x = 5, y = 5)
label2.place(x = 5, y = 30)
label3.place(x = 5, y = 55)
self.entryIP = Tkinter.Entry(root)
self.entryIP.insert(Tkinter.END, "127.0.0.1")
self.entryPort = Tkinter.Entry(root)
self.entryPort.insert(Tkinter.END, '1051')
self.entryData = Tkinter.Entry(root)
self.entryData.insert(Tkinter.END, 'Hello')
self.Recv = Tkinter.Text(root)
self.entryIP.place(x = 40, y = 5)
self.entryPort.place(x=40, y = 30)
self.entryData.place(x=40, y = 55)
self.Recv.place(y = 105)
self.send = Tkinter.Button(root, text = 'Send Data', command = self.Send)
self.send.place(x = 40, y = 80)
def Send(self):
try:
ip = self.entryIP.get()
port = int(self.entryPort.get())
data = self.entryData.get()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((ip, port))
client.send(data)
rdata = client.recv(1024)
self.Recv.insert(Tkinter.END, 'Server:'+rdata+'\n')
client.close()
except:
self.Recv.insert(Tkinter.END, "Send Error\n")
root = Tkinter.Tk()
windwo = Window(root)
root.mainloop()
使用服务器和客户端
- 开启服务器;打开监听
- 开启客户端;发送字符
- 服务器监听;接收字符
在局域网中传输文件
编写代码
- 文件传输服务器
# coding:utf-8
#
import Tkinter
import threading
import socket
import os
class ListenThread(threading.Thread):
def __init__(self, edit, server):
threading.Thread.__init__(self)
self.edit = edit
self.server = server
#
self.files = ['FileServer.py']
def run(self):
while 1:
try:
client, addr = self.server.accept()
self.edit.insert(Tkinter.END,"connect from:%s:%d\n" % addr)
data = client.recv(1024)
#
self.edit.insert(Tkinter.END,"receive File:%s\n" % data)
file = os.open(data, os.O_WRONLY|os.O_CREAT|os.O_EXCL|os.O_BINARY)
while 1:
rdata = self.client.recv(1024)
if not rdata:
break
os.write(file, rdata)
os.close(file)
self.client.close()
self.edit.insert(Tkinter.END, 'close client\n')
except:
self.edit.insert(Tkinter.END, 'close client\n')
break
class Control(threading.Thread):
def __init__(self, edit):
threading.Thread.__init__(self)
self.edit = edit
self.event = threading.Event()
self.event.clear()
def run(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("",1051))
server.listen(1)
self.edit.insert(Tkinter.END, "Waiting For Connection\n")
self.lt = ListenThread(self.edit,server)
self.lt.setDaemon(True)
self.lt.start()
self.event.wait()
server.close()
def stop(self):
self.event.set()
class Window:
def __init__(self, root):
self.root = root
self.butlisten = Tkinter.Button(root, text = "Start Listening", command = self.Listen)
self.butlisten.place(x = 20, y = 15)
self.butclose = Tkinter.Button(root, text = "Stop Listen", command = self.Close)
self.butclose.place(x = 120, y = 15)
self.edit = Tkinter.Text(root)
self.edit.place(y = 50)
def Listen(self):
self.ctrl = Control(self.edit)
self.ctrl.setDaemon(True)
self.ctrl.start()
def Close(self):
self.ctrl.stop()
root = Tkinter.Tk()
window = Window(root)
root.mainloop()
2. 文件传输客户端
# coding:utf-8
#
import Tkinter
import tkFileDialog
import socket
import os
class Window:
def __init__(self, root):
label1 = Tkinter.Label(root, text = 'IP')
label2 = Tkinter.Label(root, text = 'Port')
#
label3 = Tkinter.Label(root, text = 'File')
label1.place(x = 5, y = 5)
label2.place(x = 5, y = 30)
label3.place(x = 5, y = 55)
self.entryIP = Tkinter.Entry(root)
self.entryIP.insert(Tkinter.END, "127.0.0.1")
self.entryPort = Tkinter.Entry(root)
self.entryPort.insert(Tkinter.END, '1051')
self.entryData = Tkinter.Entry(root)
self.entryData.insert(Tkinter.END, 'Hello')
self.entryIP.place(x = 40, y = 5)
self.entryPort.place(x=40, y = 30)
self.entryData.place(x=40, y = 55)
#
self.send = Tkinter.Button(root, text = 'Send Data', command = self.Send)
self.openfile = Tkinter.Button(root, text = 'OpenFile', command = self.Openfile)
self.send.place(x = 40, y = 80)
self.openfile.place(x = 140, y = 80)
def Send(self):
try:
ip = self.entryIP.get()
port = int(self.entryPort.get())
#
filename = self.entryData.get()
tt = filename.split('/')
name = tt[len(tt)-1]
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((ip, port))
client.send(name)
file = os.open(filename, os.O_RDONLY|os.O_EXCL|os.O_BINARY)
while 1:
data = os.read(file, 1024)
if not data:
break
client.send(data)
os.close(file)
client.close()
except:
print "Send Error"
def Openfile(self):
r = tkFileDialog.askopenfilename(title="Python Tkinter", filetypes = [('All files', '*'),('*.py *.pyw')])
if r:
self.entryData.delete(0, Tkinter.END)
self.entryData.insert(Tkinter.END, r)
root = Tkinter.Tk()
windwo = Window(root)
root.mainloop()
使用服务器和客户端
- 开启服务器;打开监听
- 开启客户端;发送文件
- 服务器监听;接收文件
什么是Python socket
Python的标准模块中提供了对网络编程的支持。
在Python中,可以使用socket模块进行底层的网络编程,也可以使用Twisted方便地编写网络程序。