Python 如何从一个连接接收多条消息?

Python 如何从一个连接接收多条消息?,python,sockets,Python,Sockets,我有一个服务器,我需要它来接收多个连接和消息。 服务器接收新连接时不会出现问题,但不会从一个连接中获取多条消息 import socket import select HEADER_LENGTH = 1024 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try:

我有一个服务器,我需要它来接收多个连接和消息。 服务器接收新连接时不会出现问题,但不会从一个连接中获取多条消息

import socket
import select


HEADER_LENGTH = 1024

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)


try:
    server_socket.bind((HOST, PORT))
except socket.error as e:
    print(str(e))

print("Server is connected")

server_socket.listen(5)

sockets_list = [server_socket]
clients = {}
print("Server is listening")


def receive_message(conn):
    try:
        data = conn.recv(HEADER_LENGTH)

        if not len(data):
            return False

        strdata = data.decode('utf-8')

        print(strdata)
        return strdata

    except Exception as e:
        print(e)
        return False


def handle_client():
    conn, addr = server_socket.accept()

    print(f"Accepted new connection from {addr[0]}:{addr[1]}")

    sockets_list.append(conn)


while True:
    read_sockets, _, exception_sockets = select.select(sockets_list, [], [], 0)

    for i in read_sockets:

        if i == server_socket:

            handle_client()


        else:

            print("received message")

            message = receive_message(i)

            if message is False:


                sockets_list.remove(i)

                try:
                    del clients[i]
                except KeyError:
                    pass

                continue


            if message is not None:
                    clients[i] = message





            if message is not None:
                for client_socket in clients:
                    if client_socket != i:
                        client_socket.send(str.encode(message))
                        print("sent to all players")

在接收到第一条消息后,服务器停止从该连接接收消息会发生什么情况。 当然还有很多代码,但我给你看了相关的代码

如果有人能帮我,我会很高兴的。我经常上网,但还没有找到解决问题的办法

更新: 我尝试将
socket.close()
放在客户端(用Java编写),然后服务器最多收到2条消息,问题是: 1.服务器最多接收2条消息。 2.连接更改(如果可能,我需要连接保持静态)

尝试此代码块

#-*- coding:utf-8 -*-
import socket
import sys

#get machine ip address
server_ip = socket.gethostbyname(socket.gethostname())
#create socket object
s = socket.socket()

#define port number
port = 6666

#bind ip and port to server
s.bind((server_ip,port))

#now waiting for clinet to connect
s.listen(5)
print("Enter this ip to connect your clinet")
print(server_ip)

clients = []
flag = True
recv_data = ""
if not clients:
    c, addr = s.accept()
    print("this is c ",c," this is  Addr ",addr)
    clients.append(c)
    recv_data = c.recv(1024)

    print(recv_data.decode("utf-8"))

if flag == True:

    while recv_data.decode("utf-8") != "EX":    
        recv_data = c.recv(1024)
        recv_data.decode("utf-8")

        if recv_data.decode("utf-8") == "EX":
            s.close()
            print("check false")
            break
s.close()
请尝试此代码块

#-*- coding:utf-8 -*-
import socket
import sys

#get machine ip address
server_ip = socket.gethostbyname(socket.gethostname())
#create socket object
s = socket.socket()

#define port number
port = 6666

#bind ip and port to server
s.bind((server_ip,port))

#now waiting for clinet to connect
s.listen(5)
print("Enter this ip to connect your clinet")
print(server_ip)

clients = []
flag = True
recv_data = ""
if not clients:
    c, addr = s.accept()
    print("this is c ",c," this is  Addr ",addr)
    clients.append(c)
    recv_data = c.recv(1024)

    print(recv_data.decode("utf-8"))

if flag == True:

    while recv_data.decode("utf-8") != "EX":    
        recv_data = c.recv(1024)
        recv_data.decode("utf-8")

        if recv_data.decode("utf-8") == "EX":
            s.close()
            print("check false")
            break
s.close()

我看到了这些例子,但它们不能满足我的需要。我想将客户端添加到字典中,并将始终连接以获取通知等。什么是
server\u socket.setsockopt(socket.SOL\u socket,socket.SO\u REUSEADDR,1)
。我知道这与你的问题无关,但我不知道。据我所知,
套接字。因此_REUSEADDR
允许代码多次重复使用地址。如果地址不久前断开连接,套接字就不会对第二个示例“生气”,这个示例也不能回答我的问题。因为,他在哪里保存连接?同样,我想将客户端保存在一个字典中(查看我的代码),然后循环字典并向它们发送消息,而且它们始终是连接的。我看到了示例,但它们不能满足我的需要。我想将客户端添加到字典中,并将始终连接以获取通知等。什么是
server\u socket.setsockopt(socket.SOL\u socket,socket.SO\u REUSEADDR,1)
。我知道这与你的问题无关,但我不知道。据我所知,
套接字。因此_REUSEADDR
允许代码多次重复使用地址。如果地址不久前断开连接,套接字就不会对第二个示例“生气”,这个示例也不能回答我的问题。因为,他在哪里保存连接?同样,我希望将客户机保存在一个字典中(查看我的代码),然后循环字典并向他们发送消息,而且,他们始终保持连接。