我正在尝试用socket实现进程间通信。我有一个作为套接字服务器的代码。当接收到消息时,服务器将所有消息广播给其他连接的客户端。你知道吗
from socket import AF_INET, gethostname, socket, SOCK_STREAM
import _thread as thread
clients = []
HOST = gethostname()
PORT = 33000
BUFFER_SIZE = 1024
ADDR = (HOST, PORT)
s = socket(AF_INET, SOCK_STREAM)
s.bind(ADDR)
def accept_client():
while True:
client, _ = s.accept()
clients.append(client)
print("Client accepted.")
thread.start_new_thread(handle_client, (client, ))
def handle_client(client):
while True:
message = client.recv(BUFFER_SIZE)
print("Incoming message: {}".format(message.decode('utf-8')))
broadcast(message)
def broadcast(message):
print("Broadcasting...")
for c in clients:
print("Broadcasting to {}".format(c))
c.send(message)
if __name__ == '__main__':
s.listen()
print("Listening...")
thread.start_new_thread(accept_client, ())
try:
while True:
pass
except KeyboardInterrupt:
print("Exited.")
exit(0)
这是我的客户的课程。你知道吗
from socket import AF_INET, gethostname, socket, SOCK_STREAM
import _thread as thread
class SocketClient:
buffer_size = 1024
def __init__(self, host=gethostname(), port=33000):
self.host = host
self.port = port
self.buffer_size = 1024
self.s = socket(AF_INET, SOCK_STREAM)
self.s.connect((self.host, self.port))
def bind_callback(self, callback, args=()):
thread.start_new_thread(self.receive, (callback, args))
def receive(self, callback, args):
while True:
try:
msg = self.s.recv(self.buffer_size).decode('utf-8')
callback(msg, *args)
except OSError as err:
self.close()
raise err
except NameError:
raise err
def send(self, msg):
try:
self.s.send(msg.encode('utf-8'))
except:
self.close()
def close(self):
self.send('{clientClose}')
self.s.close()
在我创建了SocketClient
对象的另一个脚本中,在脚本终止后有无限多的传入套接字(在Python中通过Ctrl+D)。服务器脚本(接收到传入套接字时打印一次尝试)反复显示:
Incoming message:
Broadcasting...
Broadcasting to <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.1.1', 33000), raddr=('127.0.0.1', 44126)>
Broadcasting to <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.1.1', 33000), raddr=('127.0.0.1', 44276)>
请注意,似乎没有传入消息。你知道吗
我的假设是我未能正确关闭套接字连接(在退出之前)。如何做到这一点?先谢谢你。你知道吗
调用
client.recv(1024)
将阻塞并返回1到1024字节,除非客户机断开连接,在这种情况下,它将返回一个空的bytestring:相关问题 更多 >
编程相关推荐