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

如何使用Python socket

使用socket模块建立网络通讯

编写代码

  1. 网络通讯服务器
# 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()

这里写图片描述

使用服务器和客户端

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

在局域网中传输文件

编写代码

  1. 文件传输服务器
# 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()

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

使用服务器和客户端

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

什么是Python socket

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值