【脚本语言系列】关于Python网络编程socket,你需要知道的事

来源:互联网 发布:阿里云企业邮箱 smtp 编辑:程序博客网 时间:2024/06/06 12:21

如何使用Python socket

使用socket模块建立网络通讯

编写代码

  1. 网络通讯服务器
# coding:utf-8 #import Tkinterimport threadingimport socketclass 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")                breakclass 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 Tkinterimport socketclass 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()

这里写图片描述

使用服务器和客户端

  1. 开启服务器;打开监听
    这里写图片描述
    这里写图片描述
  2. 开启客户端;发送字符
    这里写图片描述
    这里写图片描述
  3. 服务器监听;接收字符
    这里写图片描述

在局域网中传输文件

编写代码

  1. 文件传输服务器
# coding:utf-8 #import Tkinterimport threadingimport socketimport osclass 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')                breakclass 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 Tkinterimport tkFileDialogimport socketimport osclass 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()

这里写图片描述
这里写图片描述

使用服务器和客户端

  1. 开启服务器;打开监听
    这里写图片描述
    这里写图片描述
  2. 开启客户端;发送文件
    这里写图片描述
    这里写图片描述
    这里写图片描述
  3. 服务器监听;接收文件
    这里写图片描述

什么是Python socket

Python的标准模块中提供了对网络编程的支持。
在Python中,可以使用socket模块进行底层的网络编程,也可以使用Twisted方便地编写网络程序。

阅读全文
0 0
原创粉丝点击