我对python有点陌生,这是我第一次使用sockets,我尝试创建一个有客户机和服务器的应用程序,用户可以在客户机中键入内容,然后将其发送到服务器,然后服务器将其发送到所有其他客户机。我已将其设置为工作状态,但每当我尝试发送第二条消息时,总会收到一个错误“error:[Errno 10058]发送或接收数据的请求被拒绝,因为套接字已在该方向上通过上次关闭调用关闭。”。我怎样才能做到这一点
尝试在启动新套接字或发送新消息之前添加套接字shutdown和close,尝试再次使用现有的套接字,两种方法都不起作用,但程序在发送到服务器时挂起
服务器
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def __init__():
HOST = '0.0.0.0'
PORT = 50012
print("Initialising..")
print("Initialized.")
print("Binding..")
s.bind((HOST, PORT))
print("Bound.")
print("Listener started")
__listen__(HOST, PORT)
def __broadcast__(list_clients, conn, addr, HOST, PORT):
print("broadcasting")
while 1:
data = conn.recv(1024)
if not data: break
print "{} Recieved from {}".format(data, addr)
for x in list_clients:
conn.sendto(data, x)
__listen__(HOST, PORT)
def __listen__(HOST, PORT):
print("listening")
s.listen(1)
conn, addr = s.accept()
list_clients=[]
list_clients.append(addr)
print 'Connected by', addr
__broadcast__(list_clients, conn, addr, HOST, PORT)
def ext():
conn.close()
def __main__():
print("Initialising..")
__init__()
print("Initialized.")
print("Listener starting..")
__listen__()
__init__()
客户
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def __init__():
HOST = '127.0.0.1'
PORT = 50012
__connect__(HOST, PORT)
def __connect__(HOST, PORT):
s.connect((HOST, PORT))
__sendmessage__(HOST, PORT)
def __sendmessage__(HOST, PORT):
s.sendall(raw_input("You $: "))
while 1:
data = s.recv(1024)
print data
__sendmessage__(HOST, PORT)
def __exit__():
s.shutdown(0)
__init__()
您的服务器每次调用} 来说很简单。将
__listen__()
并因此accept()
递归地调用sendto()
客户机,即。e。它在每一条消息发送后等待一个新的连接-这无法工作。 服务器必须同时等待来自客户端的连接和数据;这对于^{__init__()
、__broadcast__()
和__listen__()
替换为客户端也有一个类似的问题,即不能同时等待套接字和终端输入。对于工作的客户机实现,请参阅Handle multiple requests with select的答案
相关问题 更多 >
编程相关推荐