我对python有点陌生,这是我第一次使用套接字,我试图制作一个具有客户端和服务器的应用程序,用户可以在客户端中输入,它将被发送到服务器,然后将其发送给所有其他客户端。我已经将其设置为工作状态,但每当我尝试发送第二条消息时,我总是收到一个错误错误:[Errno 10058]发送或接收数据的请求被禁止,因为套接字已经在之前的关闭调用中关闭了该方向。我如何才能做到这一点?
尝试在启动新套接字或发送新消息之前关闭套接字并关闭,尝试再次使用现有套接字,但两者都不起作用。没有错误,但程序只是在发送到服务器时挂起。
计算机网络服务器
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__(),
从而在每次发送客户端 sendto()
后递归地接受(),
即它在发送每条消息后等待新连接 - 这无法工作。服务器必须同时等待来自客户端的连接和数据;这很容易使用select.select()。
将 __init__()
、__broadcast__(
) 和 __listen__()
替换为
from select import select
HOST = '0.0.0.0'
PORT = 50012
s.bind((HOST, PORT))
s.listen(1)
list_clients = []
for reads in iter(lambda: select([s]+list_clients, [], [])[0], []):
for ready in reads: # each time select reports something is ready
if s == ready: # accept new client if it's the server socket
conn, addr = s.accept()
list_clients.append(conn) # store the connection socket
print 'connected by', addr
else: # data from a client
try: data = ready.recv(1024)
except socket.error: data = ''
if not data: # client disconnected, remove
list_clients.remove(ready)
ready.close()
continue
print "{} received from {}".format(data, ready.getpeername())
print("broadcasting")
for x in list_clients: x.send(data)
客户端也有类似的问题,不同时等待套接字和终端输入。对于工作客户端实现,请参见这个答案,用select处理多个请求。
我需要在netty中有一个客户机/服务器通信,用于我的项目目的之一。所以我刚开始用一个handsOn来改进,我正在学习netty,我是一个初学者。 我尝试了一个简单的客户端服务器与Netty聊天。 客户端和服务器正在初始化,我可以看到服务器能够获得用于建立连接的客户端管道,但是当客户端发送消息时,它没有进入ServerAdapterHandler的messageReceived部分。下面是我的源代
我正在尝试创建一个简单的聊天应用程序之间的两个用户,使用twilio js API。 如果它已经存在,则表示另一个用户已经登录,我希望加入此通道。 否则,我想用这个特定名称创建一个通道,并等待其他用户。 我尝试了两种选择:1。聊天客户端。2.IPMessaging客户端。 我正在尝试使用此功能:
我一直在努力通过Smack和Openfire服务器与XMPP聊天。我的问题如下: 每当一个用户向另一个用户发送消息时,该消息就会在另一个用户处正确接收。但是任何回复都不会出现在第一条消息的发件人处。因此,用户1成功地发送给用户2。然后,用户2无法向用户1发送任何回复。另一方面,如果我重新启动并让用户再次登录,则用户2可以发送给用户1,但反之亦然。 我想说的是,只有聊天的发起者才能发送消息,接收者不
如何在聊天客户端发送媒体消息?我使用的是JS SDK,基于教程https://www.twilio.com/docs/api/chat/guides/media-support,但是出现了错误。我使用的方法如下所示: 错误消息:
我已经实现了一个通过套接字进行通信的全局聊天。客户端写入一条消息,发送到服务器,然后服务器将消息发回给所有客户端。每个客户端都由一个名为ClientThread的类表示,因此每个客户端都是一个线程。每次新客户端连接时,我都会创建一个新的ClientThread实例,并将所有这些实例存储在列表中。现在我想实现一个私人聊天,这样每个客户端就可以私下与另一个客户端交谈(或者2,3或更多的群聊)。 我还想
我想在java上创建一个客户机/服务器应用程序,服务器的IP地址为192.168.1.100,在端口4500上等待客户机请求。 客户端从键盘上读取字符串,向服务器发送连接请求。一旦建立了连接,它就会将字符串发送到服务器。 这是我尝试的代码: 对于服务者: 对于客户端: 但这段代码有一个问题: