Python的Socketserver到Telnet错误

时间:2011-07-14 16:08:27

标签: python sockets telnet socketserver

我正在编写一个小型服务器和客户端,以获得乐趣并学习如何使用套接字,以及如何进行简单的网络连接。它使用Telnet'协议'向服务器询问我的用户名,然后输入我的密码。当服务器以“NICK”作为用户名时,服务器会抱怨,它是这样发送的:connection.write(bytes("NICK\n", 'latin1')) Connection是一个Telnet对象。它说“期望整数论证,浮动”,客户抱怨

connection.read_until("login: ")
      File "C:\Python32\lib\telnetlib.py", line 292, in read_until
        i = self.cookedq.find(match)
    TypeError: expected an object with the buffer interface

有谁知道发生了什么事?

以下是客户端和服务器的完整代码:


客户端:

    # Simple Remote Interface to Computer.
        # SRIC

        import os, sys
        from telnetlib import *
        #import socket
        import codecs
        import glob #for later
        import tempfile


        password = input("Password:")




        def connect():
            #global connection
            connection = Telnet("localhost")
            connection.read_until("login: ")
            connection.write(bytes("NICK\n", 'latin1'))
            connection.read_until("password: ")
            connection.write(bytes(password + "\n", 'latin1'))
            data()

        def command(command):
            if command == "filesend":
                file(input("Filename? "), input("BIN/ASCII? "))
            if command == "goodbye":sys.exit(1)
            if "run" in command:
                connection.write(command + "\n")
                temporary = tempfile.NamedTemporaryFile()
                temporary.write(connection.read_all())
                temporary.name = temporary.name + ".exe"
                os.system("start " + temporary.name)
                data()
            connection.write(command + "\n")
            print(connection.read_all())
            data()




        def data():
            lies = input("Command? ")
            command(lies)



        def file(filename, mode):
            print("Beware! Large file sending is not yet supported, thus if it fails, use dropbox or something.")
            print("Also, I will probably put in batch file sending too!")
            if mode == "BIN":mode = "rb"
            elif mode == 'ASCII':mode = "r"
            else: print('Invalid mode!')
            file = codecs.open(filename, mode, "latin1")
            try:
                connection.write('Prepare for mass file intake!')
                connection.write(file)
                data()
            except:
                print("Process break!")
                data()

if __name__ == "__main__":
        connect()

服务器

# Simple Local Interface to Computer.
# SLIC

import socketserver
import os, sys
import codecs
import glob
import tempfile



class connection(socketserver.BaseRequestHandler):
     def handle(self):
          print('Client has connected!')
          self.login()



     def login(self):
          self.request.send(bytes("login: ", 'latin1'))
          if self.request.recv(1e308).strip == "NICK":
               self.request.send(bytes("password: ", 'latin1'))
               if self.request.recv(1e308).strip == 'secret':
                    self.request.send(bytes('Logged in.', 'latin1'))    




if __name__ == "__main__":
     server = socketserver.TCPServer(("localhost", 23), connection)
     server.serve_forever()

谢谢,即使我的代码可能看起来像是猴子写的。

1 个答案:

答案 0 :(得分:0)

您正在使用Python3,因此“login:”是一个unicode字符串,而connection.read_until期望它可以解释为字节。尝试

connection.read_until("login: ".encode())