我正在编写一个小型服务器和客户端,以获得乐趣并学习如何使用套接字,以及如何进行简单的网络连接。它使用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()
谢谢,即使我的代码可能看起来像是猴子写的。
答案 0 :(得分:0)
您正在使用Python3,因此“login:”是一个unicode字符串,而connection.read_until期望它可以解释为字节。尝试
connection.read_until("login: ".encode())