试图弄清楚问题出在哪里让我头疼。我有一个基本的客户端和一个服务器,客户端发送一个请求,服务器回复一个答案,问题是服务器没有发送他期望的内容。
非常感谢能帮助我的人,非常感谢。 这是代码: 客户代码:
def main():
import socket
my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_socket.connect(('127.0.0.1',8000))
info = input(r"Enter what you want to send to the server: ")
while info != "exit":
my_socket.send(info.encode('ascii'))
if info != "EXIT":
data_from_server = my_socket.recv(2).decode('ascii')
data_from_server = my_socket.recv(int(data_from_server))
print(data_from_server.decode('ascii'))
info = input("Enter what you want to send to the server: ")
else:
info = "exit"
my_socket.close()
if __name__ == '__main__':
main()
这是服务器代码:
import socket
import sys
import time
from random import randrange
SERVER_NAME = "010101"
def number_of_elements(str):
num = 0
for e in str:
num += 1
return num
def main():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0',8000))
while True:
server_socket.listen(1)
client_socket, client_adresss = server_socket.accept()
client_request = client_socket.recv(4)
while client_request != b'EXIT':
if client_request == b'TIME':
num_of_chars = number_of_elements(time.ctime())
client_socket.send(str(num_of_chars).encode('ascii'))
client_socket.send(time.ctime().encode('ascii'))
elif client_request == b'NAME':
num_of_chars = number_of_elements(SERVER_NAME)
client_socket.send(str(num_of_chars).encode('ascii'))
client_socket.send(SERVER_NAME.encode('ascii'))
elif client_request == b'RAND':
num = 2
client_socket.send(str(num).encode('ascii'))
random_num = randrange(11)
client_socket.send(str(random_num).encode('ascii'))
else:
s = str(len("Incorrect Command"))
client_socket.send(s.encode('ascii'))
client_socket.send(b"Incorrect Command")
try:
client_request = client_socket.recv(4)
except:
client_request = b"EXIT"
client_socket.close()
server_socket.close()
if __name__ == '__main__':
main()
答案 0 :(得分:1)
此电话:
client_request = client_socket.recv(4)
表示您要输入4个字节。但是套接字库可以并且将提供的内容少于基于TCP行为的内容。而且您的代码没有检查实际收到的字节数。
对服务器进行编码,就好像它一次只接收1个字节一样。和/或准备多次调用recv
并将字节数累积到顺序缓冲区中,直到收到期望的数目为止。