Python 如何从SocketServer MyTCPHandler获取另一个类的输入
在下面的程序中,我试图从MyTCPHandler获取一个类网络的输入。因此,理想情况下,我希望,例如,从MyTCPHandler获取self.data并更改网络中的self.\u标题。和往常一样,对于这个简单的问题我深表歉意,但我对python中的类非常陌生,我在这方面有点困难。谢谢你的帮助Python 如何从SocketServer MyTCPHandler获取另一个类的输入,python,sockets,tkinter,Python,Sockets,Tkinter,在下面的程序中,我试图从MyTCPHandler获取一个类网络的输入。因此,理想情况下,我希望,例如,从MyTCPHandler获取self.data并更改网络中的self.\u标题。和往常一样,对于这个简单的问题我深表歉意,但我对python中的类非常陌生,我在这方面有点困难。谢谢你的帮助 from Tkinter import * import time import math import lockfile import functions import SocketServer impo
from Tkinter import *
import time
import math
import lockfile
import functions
import SocketServer
import threading
class Network(Frame):
""" Implements a stop watch frame widget. """
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
HOST, PORT = "192.168.2.3", 9999
self._server = SocketServer.TCPServer((HOST, PORT),MyTCPHandler)
t = threading.Thread(target=self._server.serve_forever)
t.setDaemon(True)
t.start()
self._title="hello"
self.makeWidgets()
def makeWidgets(self):
""" Make the time label. """
self._canvas = Canvas(self, width=600, height=400)
self._canvas.pack()
class MyTCPHandler(SocketServer.BaseRequestHandler):
"""
The RequestHandler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
#I want to set the above title to "self.data"
self.request.sendall(self.data.upper())
def main():
root = Tk()
#sw = StatusTable(root)
#sw.pack(side=RIGHT)
nw = Network(root)
nw.pack(side=TOP)
root.mainloop()
if __name__ == '__main__':
main()
我仍在努力解决这个问题,我当前的代码如下。我有两个问题。1.理想情况下,我想在网络类中设置IP地址,这可能吗? 2.self._服务器似乎没有属性“_title”,这是我试图从MyTCPHandler传递的属性
from Tkinter import *
import time
import math
import lockfile
import functions
import SocketServer
import threading
class Network(Tk):
def __init__(self,server):
Tk.__init__(self)
self._server=server
t = threading.Thread(target=self._server.serve_forever)
t.setDaemon(True) # don't hang on exit
t.start()
self.makeWidgets()
def makeWidgets(self):
""" Make the time label. """
self._canvas = Canvas(self, width=600, height=400)
self._canvas.pack()
radius=20
l = Label(self,text=self._server._title)
l.pack(fill=X, expand=NO, pady=2, padx=2)
class MyTCPHandler(SocketServer.BaseRequestHandler):
def __init__(self):
self._title=StringVar()
self._title="test"
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
self._title="change"
print "changed?"
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
def main():
HOST, PORT = "10.0.1.08", 9999
print HOST
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT),MyTCPHandler)
#sw = StatusTable(root)
#sw.pack(side=RIGHT)
nw = Network(server)
nw.mainloop()
既然两个类都在同一个进程中(因此内存空间也相同),为什么不使用共享数据呢。如果您担心数据被线程覆盖,那么可以在该数据上添加一个锁
你也可以考虑让第二个类成为第一个类的实例——在这种情况下,共享数据是无缝的。下面是一个讨论,您可能会发现它很有用:
尝试此操作(如果您只有一个客户端并且可以被覆盖,则可以移除锁):这听起来不错。是否有特定的共享数据模块,或者这是内置的?您可以将数据定义为全局变量。如果你有多个线程,你可以使用线程模块提供的锁。太好了,我会检查它。非常感谢。对于IP地址(代码中的主机),您应该使用服务器使用的IP地址。如果您不知道并将在服务器上运行此代码,则只需将其保留为emtpy字符串:HOST=“”。您可以使用print(dir(self.\u server))打印self.\u服务器可用的所有方法/属性。如果它没有“_title”,那么您就不能使用它。为什么要尝试使用不存在的属性?
lock = threading.Lock()
data_title = ""
class Network(Tk):
def __init__(self,server):
Tk.__init__(self)
self._server=server
t = threading.Thread(target=self._server.serve_forever)
t.setDaemon(True) # don't hang on exit
t.start()
self.makeWidgets()
def makeWidgets(self):
""" Make the time label. """
print(dir(self._server))
self._canvas = Canvas(self, width=600, height=400)
self._canvas.pack()
radius=20
lock.acquire()
l = Label(self,text=data_title)
lock.release()
l.pack(fill=X, expand=NO, pady=2, padx=2)
class MyTCPHandler(SocketServer.BaseRequestHandler):
def __init__(self):
self._title=StringVar()
self._title="test"
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
lock.acquire()
self._title="change"
lock.release()
print "changed?"
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())