簡體   English   中英

客戶端和服務器之間的 Python sockets 問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM