【发布时间】:2020-06-08 12:03:50
【问题描述】:
我正在尝试学习套接字编程,目前有以下 server 和 client 代码,但问题是服务器和/或客户端不能同时发送和接收消息,它们是轮流发送和接收消息。
我查看了下面的示例,但答案似乎无法解决问题,或者我的做法有误。
Python Socket - Send/Receive messages at the same time
服务器
import socket
import threading
s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host, port))
s.listen(1)
print("Waiting for connections")
conn, addr = s.accept()
print("Client has connected")
conn.send("Welcome to the server".encode())
def recv_msg():
while True:
recv_msg = conn.recv(1024)
if not recv_msg:
sys.exit(0)
recv_msg = recv_msg.decode()
print(recv_msg)
def send_msg():
send_msg = input(str("Enter message: "))
send_msg = send_msg.encode()
conn.send(send_msg)
print("message sent")
while True:
send_msg()
t = threading.Thread(target=recv_msg)
t.start()
客户
import socket
import threading
s = socket.socket()
host = socket.gethostname()
port = 8080
s.connect((host, port))
print("Connected to the server")
message = s.recv(1024)
message = message.decode()
print(message)
def recv_msg():
while True:
recv_msg = s.recv(1024)
if not recv_msg:
sys.exit(0)
recv_msg = recv_msg.decode()
print(recv_msg)
def send_msg():
send_msg = input(str("Enter message: "))
send_msg = send_msg.encode()
s.send(send_msg)
print("Message sent")
while True:
send_msg()
t = threading.Thread(target=recv_msg)
t.start()
我正在尝试创建一个类似于 Whatsapp/Imessage 等的聊天应用程序(使用 kivy),我还没有找到关于如何做到这一点的教程(我所看到的所有内容都是关于创建一个聊天室),所以如果有人看到,将不胜感激。
【问题讨论】:
-
顺便说一句,
send_msg.encode()使用您的默认编码,该编码因机器而异。相反,请选择每个人都在聊天频道send_msg.encode('utf-8')上使用的编码。 -
要同时发送和接收,您可能需要两个单独的线程。一个只从服务器发送到客户端,第二个只从客户端发送到服务器。或者您必须使用一个线程,并且客户端应该定期发送带有新消息或空消息的请求(如果客户端没有要发送的内容),然后获得新的答案或空答案(如果服务器没有要发送的内容)。这样它将从服务中获取新值,并且服务器不需要在单独的套接字中发送它。
-
我不确定我是否完全理解您的意思
-
一个线程只能在一个方向(客户端->服务器)发送,另一个线程只能在另一个方向(服务器->客户端)发送。或者在一个线程中发送
client->server,然后发送server->client,并以恒定的延迟一次又一次地重复它。如果没有要发送的内容,则发送空消息,因此它总是发送一些东西(因为对方会尝试接收一些东西)。 -
顺便说一句:在客户端和服务器的当前代码中,您必须在运行
while True: send_msg()之前启动线程。
标签: python multithreading sockets