开发者

Python's Socketserver to Telnet errors

I'm writing a tiny server and client kind of for fun and learn how to use sockets, and how to do some simple networking. It uses the Telnet 'protocol' to ask the server for my username, and then I enter my password. T开发者_运维技巧he server complains when it gets "NICK" as a username, it was sent like this: connection.write(bytes("NICK\n", 'latin1')) Connection is a Telnet object. It says "Integer argument expected, got float" and the client complains that

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

Does anyone know what was going on?

Here's the full code for the client and the server:


Client:

    # 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()

Server:

# 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()

Thanks, even though my code probably looks like a monkey wrote it.


You are using Python3, so "login: " is a unicode string, while connection.read_until is expecting something it can interpret as bytes. Try

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜