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

时间:2019-11-16 11:25:51

标签: 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:
    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.连接更改(如果可能,我需要连接保持静态)

1 个答案:

答案 0 :(得分:0)

尝试此代码块

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