Python 当我在diesel中使用yield时,telnet连接关闭
嗨,我想创建聊天服务器。我使用此代码运行: 当我从代码中删除yield时,连接到服务器并没有问题Python 当我在diesel中使用yield时,telnet连接关闭,python,chat,Python,Chat,嗨,我想创建聊天服务器。我使用此代码运行: 当我从代码中删除yield时,连接到服务器并没有问题 def chat_server(addr): my_nick = until_eol().strip() while True: message = diesel.until_eol() shouted_message = my_nick + ":" + message diesel.send(shouted_message)
def chat_server(addr):
my_nick = until_eol().strip()
while True:
message = diesel.until_eol()
shouted_message = my_nick + ":" + message
diesel.send(shouted_message)
my_message = until_eol()
other_message = wait('chat_message')
if my_message:
fire('chat_message', (my_nick, my_message.strip()))
这段代码怎么了?可能是这样的。它可能无法立即工作,因为我不熟悉柴油机的工作原理
import StringIO
import socket
import threading
from diesel import Application, Service, until_eol, fire, wait
class socket_thread(threading.Thread):
def __init__(self, line_filter = None):
threading.Thread.__init__(self)
self.daemon = True
self.lock = threading.Lock()
self.event = threading.Event()
self.event.clear()
self.buffer = StringIO.StringIO()
if(line_filter == None):
self.line_filter = lambda x: x
else:
self.line_filter = line_filter
def run(self):
message = True
while message:
message = diesel.until_eol()
self.lock.acquire()
self.buffer.write(message)
self.lock.release()
self.event.set()
def readlines(self):
self.lock.acquire()
self.buffer.seek(0)
raw_lines = self.buffer.readlines()
self.buffer.truncate(0)
self.lock.release()
lines = map(self.line_filter, raw_lines)
return lines
def chat_server(addr):
server_recv = socket_thread()
my_nick = until_eol().strip()
data = []
server_recv.start()
while True:
server_recv.event.wait()
data = server_recv.readlines()
if(data):
shouted_message = my_nick + ":" + data
diesel.send(shouted_message)
server_recv.event.clear()
my_message = until_eol()
other_message = wait('chat_message')
if my_message:
fire('chat_message', (my_nick, my_message.strip()))
app = Application()
app.add_service(Service(chat_server, 8000))
app.run()
我找到了正确的代码:
#vim:ts=4:sw=4:expandtab
''简单的聊天服务器。
telnet,键入您的姓名,按enter键,然后聊天。邀请
一个朋友也可以这样做。
'''
从柴油进口申请,服务,直到下线,消防,第一,发送
def聊天室服务器(地址):
my_nick=until_eol().strip()
尽管如此:
evt,data=first(直到eol=True,等待=['chat\u message'])
如果evt==“直到下线”:
fire('chat\u message',(my\u nick,data.strip())
其他:
尼克,消息=数据
发送(“%s\r\n”%(尼克,消息))
app=应用程序()
应用程序添加服务(服务(聊天服务器,8000))
app.run()
等待“message=diesel.until_eol()”的进程是否使连接保持活动状态?可能您希望使用线程来代替常规线程(如服务器消息累积线程和客户端消息累积/服务器消息处理线程)。是的,它可以保持连接的活动状态。你能给我一个在这段代码中使用线程的例子吗?diesel刚才放弃了yield
语法。现在,它在幕后使用greenlet。下面被接受的答案(我认为来自柴油机的例子)是正确的方法。谢谢你的回答。我发现正确的代码应该作为这个问题的答案发布。
def chat_server(addr):
my_nick = until_eol().strip()
while True:
message = diesel.until_eol()
shouted_message = my_nick + ":" + message
diesel.send(shouted_message)
my_message = until_eol()
other_message = wait('chat_message')
if my_message:
fire('chat_message', (my_nick, my_message.strip()))
import StringIO
import socket
import threading
from diesel import Application, Service, until_eol, fire, wait
class socket_thread(threading.Thread):
def __init__(self, line_filter = None):
threading.Thread.__init__(self)
self.daemon = True
self.lock = threading.Lock()
self.event = threading.Event()
self.event.clear()
self.buffer = StringIO.StringIO()
if(line_filter == None):
self.line_filter = lambda x: x
else:
self.line_filter = line_filter
def run(self):
message = True
while message:
message = diesel.until_eol()
self.lock.acquire()
self.buffer.write(message)
self.lock.release()
self.event.set()
def readlines(self):
self.lock.acquire()
self.buffer.seek(0)
raw_lines = self.buffer.readlines()
self.buffer.truncate(0)
self.lock.release()
lines = map(self.line_filter, raw_lines)
return lines
def chat_server(addr):
server_recv = socket_thread()
my_nick = until_eol().strip()
data = []
server_recv.start()
while True:
server_recv.event.wait()
data = server_recv.readlines()
if(data):
shouted_message = my_nick + ":" + data
diesel.send(shouted_message)
server_recv.event.clear()
my_message = until_eol()
other_message = wait('chat_message')
if my_message:
fire('chat_message', (my_nick, my_message.strip()))
app = Application()
app.add_service(Service(chat_server, 8000))
app.run()
# vim:ts=4:sw=4:expandtab
'''Simple chat server.
telnet, type your name, hit enter, then chat. Invite
a friend to do the same.
'''
from diesel import Application, Service, until_eol, fire, first, send
def chat_server(addr):
my_nick = until_eol().strip()
while True:
evt, data = first(until_eol=True, waits=['chat_message'])
if evt == 'until_eol':
fire('chat_message', (my_nick, data.strip()))
else:
nick, message = data
send("<%s> %s\r\n" % (nick, message))
app = Application()
app.add_service(Service(chat_server, 8000))
app.run()