客户端和服务器之间的Python套接字问题

时间:2019-11-22 16:48:58

标签: python sockets server client

试图弄清楚问题出在哪里让我头疼。我有一个基本的客户端和一个服务器,客户端发送一个请求,服务器回复一个答案,问题是服务器没有发送他期望的内容。

非常感谢能帮助我的人,非常感谢。 这是代码: 客户代码:

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()

这是一个例子 Example

1 个答案:

答案 0 :(得分:1)

此电话:

client_request = client_socket.recv(4)

表示您要输入4个字节。但是套接字库可以并且将提供的内容少于基于TCP行为的内容。而且您的代码没有检查实际收到的字节数。

对服务器进行编码,就好像它一次只接收1个字节一样。和/或准备多次调用recv并将字节数累积到顺序缓冲区中,直到收到期望的数目为止。