Python 当我在diesel中使用yield时,telnet连接关闭

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)

嗨,我想创建聊天服务器。我使用此代码运行:

当我从代码中删除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)
        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()