Python 的 Socketserver 到 Telnet 错误
我正在编写一个小型服务器和客户端,目的是为了好玩,并学习如何使用套接字以及如何进行一些简单的网络连接。它使用 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()
谢谢,尽管我的代码可能看起来像猴子写的。
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. The 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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您使用的是Python3,因此“login:”是一个unicode字符串,而connection.read_until期望它可以解释为字节的东西。尝试
You are using Python3, so "login: " is a unicode string, while connection.read_until is expecting something it can interpret as bytes. Try