Skip to main content
 首页 » 编程设计

python之为什么 telnetlib 写入函数在我的 python 代码中不起作用

2024年11月01日22youxin

我学习了 python 几个星期,我试图构建一个聊天应用程序,我选择了 twisted 并且感觉很舒服,但是我在客户端测试代码中遇到了一个奇怪的问题。

这是我的服务器代码:

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 
 
class ChatServer(LineReceiver): 
 
    def __init__(self, users): 
        self.users = users 
        self.name = None 
        self.state = "GETNAME" 
 
    def connectionMade(self): 
        self.sendLine("What's your name?") 
        print 'DEBUG: Name Input Request Send Back To Client.' 
 
    def connectionLost(self, reason): 
        if self.users.has_key(self.name): 
            del self.users[self.name] 
 
    def lineReceived(self, line): 
        print 'DEBUG: A Message Recieved From Client.' 
        if self.state == "GETNAME": 
            self.handle_GETNAME(line) 
        else: 
            self.handle_CHAT(line) 
 
    def handle_GETNAME(self, name): 
        if self.users.has_key(name): 
            self.sendLine("Name taken, please choose another.") 
            return 
        self.sendLine("Welcome, %s!" % (name,)) 
        print 'DEBUG: Welcome Message Send Back To Client.' 
        self.name = name 
        self.users[name] = self 
        self.state = "CHAT" 
 
    def handle_CHAT(self, message): 
        message = "<%s> %s" % (self.name, message) 
        for name, protocol in self.users.iteritems(): 
            if protocol != self: 
                protocol.sendLine(message) 
 
class ChatServerFactory(Factory): 
 
    def __init__(self): 
        self.users = {} 
 
    def buildProtocol(self, addr): 
        return ChatServer(self.users) 
 
reactor.listenTCP(8123, ChatServerFactory()) 
reactor.run() 

这是我的客户端测试代码,我尝试通过telnet方式测试服务器。

import telnetlib 
import cmd 
import sys 
import time 
 
def test_telnet(Host, Port):      
    # connected to the server 
    tn = telnetlib.Telnet(Host, Port)   
    print 'Client Connecton Made.' 
    # tn.set_debuglevel(2) 
 
    # read back from server 
    greeting = tn.read_until("What's your name?") 
    print 'Recieved Name Input Request From Server' 
    print greeting 
    print "DEBUG: Before telnet write data" 
    username = 'amber' 
    tn.write(username + '\n') 
    print "DEBUG: After telnet write data" 
    # welcome = tn.read_until('see', 5) 
    # print 'Recieved Welcome Message From Server' 
    # print welcome 
 
    time.sleep(7) 
    tn.write("exit\n") 
    print 'Client Connection Lost.' 
 
test_telnet('localhost', 8123) 

然而,tn.write() 发送消息,但在服务器控制台中,我注意到 lineReceived 从未被调用,但在真正的 telnet 中,它被调用,这是为什么? 非常感谢!

请您参考如下方法:

LineReceiver期望行以 \r\n 结尾,而不是 \n。

将代码中的\n替换为\r\n即可解决问题。


或者,您可以更改行分隔符:

class ChatServer(LineReceiver): 
    delimiter = '\n' # <---- 
    ...