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
允许代码多次重复使用地址。如果地址不久前断开连接,套接字就不会对第二个示例“生气”,这个示例也不能回答我的问题。因为,他在哪里保存连接?同样,我希望将客户机保存在一个字典中(查看我的代码),然后循环字典并向他们发送消息,而且,他们始终保持连接。