[英]Issue with Python sockets between client and server
試圖找出問題出在哪里,我感到很頭疼。 我有一個基本的客戶端和一個服務器,客戶端發送一個請求,服務器回復一個答案,問題是服務器沒有發送他期望的內容。
我非常感謝任何可以幫助我的人,非常感謝。 這是代碼:客戶端代碼:
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()
這個電話:
client_request = client_socket.recv(4)
表示您要求 4 個字節。 但是基於 TCP 的行為,套接字庫可以並且將提供更少的內容。 而且您的代碼沒有檢查實際收到的字節數。
對您的服務器進行編碼,就好像它一次只接收 1 個字節一樣。 和/或准備好多次調用recv
並將字節數累積到順序緩沖區中,直到收到預期的數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.