python - 同时发送/接收消息套接字python
问题描述
我一直在开发一个简单的 python 套接字聊天室,客户端和服务器可以在其中相互发送消息。我遇到的问题是服务器和客户端一次只能发送一条消息。我希望它像任何其他聊天室一样工作,我可以在发送消息时收到消息,任何帮助都会有很大帮助
服务器.py
import socket
import sys
s = socket.socket()
host = socket.gethostname()
print(" server will start on host : ", host)
port = 8080
s.bind((host,port))
name = input(str("Please enter your username: "))
print("")
print("Server is waiting for incoming connections")
print("")
s.listen(1)
conn, addr = s.accept()
print("Recieved connection")
print("")
s_name = conn.recv(1024)
s_name = s_name.decode()
print(s_name, "has joined the chat room")
conn.send(name.encode())
while 1:
message = input(str("Please enter your message: "))
conn.send(message.encode())
print("Sent")
print("")
message = conn.recv(1024)
message = message.decode()
print(s_name, ":" ,message)
print("")
客户端.py
import socket
import sys
s = socket.socket()
host = input(str("Please enter the hostname of the server : "))
port = 8080
s.connect((host,port))
name = input(str("Please enter your username : "))
print(" Connected to chat server")
s.send(name.encode())
s_name = s.recv(1024)
s_name = s_name.decode()
print("")
print(s_name, "has joined the chat room ")
while 1:
message = s.recv(1024)
message = message.decode()
print(s_name, ":" ,message)
print("")
message = input(str("Please enter your message: "))
message = message.encode()
s.send(message)
print("Sent")
print("")
解决方案
CaSper 为我提供了多个客户端可以连接到服务器的服务器代码,但现在的问题是客户端无法相互通信……</p>
这主要是因为您的客户需要s_name = s.recv(1024)
,而 CaSper 的服务器不发送其名称。这是您的客户端的一个变体(期望主机和端口作为命令参数),它与 CaSper 的服务器一起使用,并且还通过使用单独的线程解决了您的原始问题(客户端一次只能发送一条消息):
import socket
import sys
s = socket.socket()
s.connect((sys.argv[1], int(sys.argv[2])))
name = input(str("Please enter your username : "))
print(" Connected to chat server")
s.send(name.encode())
def receive_and_print():
for message in iter(lambda: s.recv(1024).decode(), ''):
print(":", message)
print("")
import threading
background_thread = threading.Thread(target=receive_and_print)
background_thread.daemon = True
background_thread.start()
while 1:
s.send(input("Please enter your message: ").encode())
print("Sent")
print("")
请注意,CaSper 的服务器存在一系列不足:
- 即使现在你的客户端可以随时发送消息,服务器会一个接一个地等待客户端的消息,即在等待客户端A时,客户端B可以发送消息,但服务器只有在客户端A之后才接收并广播它发送了一些东西。
- 它不处理客户端断开连接。
- 当所有客户端断开连接时,它会进入繁忙循环。
有关更好的服务器示例,请参阅使用 select 处理多个请求的问题。
…你能不能改变我的服务器,让它工作…</p>
这是与此客户端一起使用的服务器的变体,也使用单独的线程进行输入和接收:
import socket
import sys
s = socket.socket()
host = socket.gethostname()
print(" server will start on host : ", host)
port = 8080
s.bind((host,port))
name = input(str("Please enter your username: "))
print("")
print("Server is waiting for incoming connections")
print("")
s.listen(1)
conn, addr = s.accept()
print("Recieved connection")
print("")
s_name = conn.recv(1024)
s_name = s_name.decode()
print(s_name, "has joined the chat room")
def input_and_send():
while 1:
message = name+" : "+input(str("Please enter your message: "))
conn.send(message.encode())
print("Sent")
print("")
import threading
background_thread = threading.Thread(target=input_and_send)
background_thread.daemon = True
background_thread.start()
for message in iter(lambda: conn.recv(1024).decode(), ''):
print(s_name, ":", message)
print("")
推荐阅读
- android - 更新到北极狐后,Android XML 预览不清楚
- php - 是否可以挂钩原生 PHP 函数/对象,从而更容易使用 Fibers API?
- c# - 如何在 jquery 中更新模型视图数据?
- r - 需要帮助来显示图例和与数据相似的颜色代码
- reactjs - React-Query, useQuery 仅在加载完成后返回 undefined
- java - 有没有办法使用 Advice API 获取方法签名?
- android - 如何将参数从 DAO 中的方法传递到 SQL 查询?
- wordpress - WooCommerce Api 可以批量更新库存数量吗?
- javascript - 如何让 div 占据 CSS 网格中的下一行?
- kotlin - 解决 Kotlin MPP 中的第三方 cocoapod 依赖项