【发布时间】:2015-06-27 14:34:02
【问题描述】:
我目前正在为大学做一个项目,我必须在 python 3.4 中创建一个多聊天客户端和服务器。 出于某种原因,它会连接到一个客户端,但是当第二个客户端尝试连接时,它什么也不做。但是,当第一个客户端断开连接时,另一个客户端将连接到它。有没有人有任何想法,我一直在努力解决这个问题超过 3 个小时。
客户端服务器
import socket
def Main():
print("Send 'q' to exit\n")
address = str(input("ip:port -> "))
nick = input("nick: ")
try:
if address.index(":") != 0:
host = address[:address.index(":")]
port = int(address[address.index(":")+1:])
except ValueError:
host = address
port = 5000
s = socket.socket()
s.connect((host, port))
message = input("-> ")
while message != "q":
send_message = message + "pPp" + nick
send_message2 = send_message.encode("UTF-8")
s.send(bytes(send_message2))
data = s.recv(1024)
data_decoded = data.decode("UTF-8")
data2 = data_decoded
print(data_decoded)
messageServer = str(data_decoded[:data_decoded.index("pPp")])
nickServer = str(data_decoded[data_decoded.index("pPp")+3:])
if not data_decoded == data2:
print(nickServer + ": " + messageServer)
message = input("-> ")
s.close()
if __name__ == "__main__":
Main()
服务器端:
import socket
import time
import os
from threading import Thread
folderPath = "Chat Logs"
filePath = folderPath + "/" + str(time.strftime("%H-%M-%S_%d-%m-%Y")) + ".txt"
def clientHandler(c):
while True:
data = c.recv(1024)
if not data:
break
data_decoded = data.decode("UTF-8")
message = str(data_decoded[:data_decoded.index("pPp")])
nick = str(data_decoded[data_decoded.index("pPp")+3:])
print(nick + "$" + message)
saveChat(nick, message)
print(" Sending: " + data_decoded)
c.send(bytes(data_decoded.encode("UTF-8")))
c.close()
def saveChat(nick, message):
if not os.path.exists(folderPath):
os.makedirs(folderPath)
if not os.path.exists(filePath):
f = open(filePath, "a")
f.close()
f = open(filePath, "a")
f.write(nick + ": " + message + "\n")
f.close()
def Main():
host = str(socket.gethostbyname(socket.gethostname()))
port = 5000
print(host + ":" + str(port) + "\n")
Clients = int(input("Clients: "))
s = socket.socket()
s.bind((host, port))
s.listen(Clients)
while True:
c, addr = s.accept()
print("Connection from: " + str(addr))
Thread(target=clientHandler(c)).start()
s.close()
if __name__ == "__main__":
Main()
【问题讨论】:
-
如果在你的任务范围内,你可以使用chatserver example from twisted。
-
@Robᵩ 我不害怕。还有什么想法吗?
-
你确定
s.listen(Clients),Clients大于1吗?也许只是强制一个更大的数字...... -
@ianribas,您好,我确实相信客户大于 1。我仍在为此苦苦挣扎。使用“LearningNinja”响应,程序将发送回传,但只发送一次。之后,您发送了一条消息,但它没有到达。当其他用户发送消息时错误消息:“valueerror: substring not found encoding python”
标签: python python-3.x client chat server