Ошибки Python в Socketserver для Telnet - PullRequest
2 голосов
/ 14 июля 2011

Я пишу крошечный сервер и клиент для развлечения и узнаю, как использовать сокеты и как сделать несколько простых сетей. Он использует протокол Telnet для запроса моего имени пользователя на сервере, а затем я ввожу свой пароль. Сервер жалуется, когда получает «NICK» в качестве имени пользователя, оно было отправлено так: connection.write(bytes("NICK\n", 'latin1')) Соединение является объектом 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 голосов
/ 15 июля 2011

Вы используете Python3, поэтому «login:» - это строка в юникоде, в то время как connection.read_until ожидает чего-то, что он может интерпретировать как байты. Попробуйте

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