Я пишу крошечный сервер и клиент для развлечения и узнаю, как использовать сокеты и как сделать несколько простых сетей. Он использует протокол 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()
Спасибо, хотя мой код, вероятно, выглядит так, как будто его написала обезьяна.