2

私は小さなサーバーとクライアントを楽しみのために書いており、ソケットの使用方法と簡単なネットワークの実行方法を学んでいます。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()

ありがとう、私のコードはおそらくサルが書いたように見えますが。

4

1 に答える 1

0

Python3を使用しているため、「login:」はUnicode文字列ですが、connection.read_untilは、バイトとして解釈できるものを期待しています。試す

connection.read_until("login: ".encode())
于 2011-07-14T21:57:17.180 に答える