python - TCP服务器无法在Python中正确接收数据

标签 python sockets tcp

我正在尝试使用Python制作一个TCP服务器,您必须在其中登录才能输入,但是在验证用户是否可以输入时,它总是说找不到该用户,即使该用户应该能够输入也是如此。进入。这是服务器代码:

import socket
from threading import *


class user:
    def __init__(self, username, password):
        self.username = username
        self.password = password


user1 = user('user', 'pass')

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = ""
port = 9000
serversocket.bind((host, port))


class client(Thread):
    def __init__(self, socket, address):
        Thread.__init__(self)
        self.sock = socket
        self.addr = address
        self.start()

    def run(self):
        while 1:
            self.sock.send(b'LOGIN\n')
            self.sock.send(b'Username:')
            name = self.sock.recv(1024).decode()
            print(name)
            print(user1.username)
            self.sock.send(b'Password:')
            pw = self.sock.recv(1024).decode()
            print(pw)
            print(user1.password)
            if (name == user1.username) and (pw == user1.password):
                self.sock.send(b'Welcome, ', name)
            else:
                self.sock.send(b'User not found.')


serversocket.listen(5)
print('server started and listening')
while 1:
    clientsocket, address = serversocket.accept()
    client(clientsocket, address)

我正在使用telnet与服务器通信,并且可以看到输入正确。这是确认它们相似的输出:
server started and listening
user

user
pass

pass

这是telnet控制台:
LOGIN
Username:user
Password:pass
User not found.

任何帮助表示赞赏。谢谢

最佳答案

从telnet到服务器的预期输入不是您认为的那样。
由于telnet在传输的字符串的末尾添加了结尾的\n,因此您需要剥离传入的数据。因此,最简单的方法是:

name = self.sock.recv(1024).decode().strip()
pw = self.sock.recv(1024).decode().strip()

Strip仅除去尾随的空白,可能在此处最合适。
您可以通过执行以下操作来调试并检查是否属于这种情况:

print([name])

作为一种肮脏的解决方法,您可以查看字符串的实际内容,而不仅仅是查看终端中的打印表示形式。它应该显示user\n而不是您期望的user。打印或调试变量以验证内容是否符合您的期望始终是一个好主意。

关于python - TCP服务器无法在Python中正确接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62109402/

相关文章:

Python 多处理-为已完成的进程分配新函数?

我的 PC 中的 Python 版本显示 2.7.17 而不是 3.8.5

java - 使用 java 套接字的基于控制台的登录应用程序

C套接字接收数据然后不发送它

java - 将 Toast 与 BufferedReader 一起使用

android - 使用 Android 模拟器通过 IP 和端口访问网络设备

Java-如何根据时间对tcp服务器中接收到的数据进行排序?

javascript - 使用 BeautifulSoup 在 DOM setAttribute JavaScript 中获取值

sockets - UDP打洞算法

python - iframe 不在 ipython-notebook 中呈现