客户端应用程序中的套接字未定义错误

时间:2013-04-23 01:17:45

标签: python user-interface tkinter

我正在尝试为我制作的这个脚本制作一个GUI。我想先按 connect 按钮连接到服务器。然后点击发送发送文件。但是当我按连接时它发送一个空的文本文件,发送按钮给我一个错误,我的套接字没有定义。

from Tkinter import *

class Application(Frame):

def __init__(self, master):

    Frame.__init__(self, master)
    self.grid()
    self.create_widgets()

def create_widgets(self):

    self.instruction = Label(self, text = 'Enter ip')
    self.instruction.grid(row=0, column = 0, columnspan = 2, sticky = W)

    self.instruction = Label(self, text = 'Enter Port')
    self.instruction.grid(row=1, column = 0, columnspan = 2, sticky = W)

    self.instruction = Label(self, text = '      ')
    self.instruction.grid(row=2, column = 0, columnspan = 2, sticky = W)

    self.instruction = Label(self, text = 'Enter path')
    self.instruction.grid(row=5, column = 0, columnspan = 2, sticky = W)

    self.ip = Entry(self)
    self.ip.grid(row=0, column = 1, sticky = W)

    self.port = Entry(self)
    self.port.grid(row=1, column = 1, sticky = W)

    self.path = Entry(self)
    self.path.grid(row=5, column = 1, sticky = W)

    self.submit_button = Button(self, text='connect', command = self.connect)
    self.submit_button.grid(row = 1, column = 2, sticky = W)

    self.send_button = Button(self, text='Send file', command = self.send)
    self.send_button.grid(row = 5, column = 2, sticky = W)

    self.text = Text(self, width = 80, height = 5, wrap = WORD)
    self.text.grid(row = 10, column = 0, columnspan = 3, sticky = W)

def connect(self):

    ip = self.ip.get()
    port = int(self.port.get())

    import socket
    import sys
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip, port))

    self.text.insert(0.0, 'connecting to' ,ip, port )

def send(self):
    path = self.path.get()
    f=open (path, "rb") 
    l = f.read(1024)
    while (l):
        s.send(l)
        l = f.read(1024)
    s.close()

 root = Tk()
 root.title("Client")
 root.geometry("420x200")
 app = Application(root)

 root.mainloop()

这是我的服务器脚本

from Tkinter import *

import socket
import sys

class Application(Frame):

def __init__(self, master):

    Frame.__init__(self, master)
    self.grid()
    self.create_widgets()

def create_widgets(self):

    self.text = Text(self, width = 35, height = 5, wrap = WORD)
    self.text.grid(row = 0, column = 0, columnspan = 2, sticky = W)

    self.submit_button = Button(self, text='start', command = self.start)
    self.submit_button.grid(row = 2, column = 0, sticky = W)

def start(self):

    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.text.insert(0.0, 'Server started!\n' )
    self.s.bind(('',1080))
    self.s.listen(10)

    while True:
        sc, address = self.s.accept()
        i=1
        f = open('file_'+ str(i)+".txt",'wb') #open in binary
        i=i+1
        while (True):       
            l = sc.recv(1024)
            while (l):
                print l 
                f.write(l) 
                f.flush()
                l = sc.recv(1024)
        f.close()

        sc.close()

    #s.close()


  root = Tk()
  root.title("Server")
  root.geometry("500x250")
  app = Application(root)
  root.mainloop()

1 个答案:

答案 0 :(得分:2)

sconnect的局部变量,因此它不在send方法的范围内。由于您已经在为应用程序使用了类,因此可以使用s替换每个self.s来存储对套接字的引用。

另外请记住,您的套接字操作在GUI线程上运行,因此您的应用程序在完成执行之前不会响应。作为一种可能的解决方案,您可以使用threading module在单独的线程上运行它们。