【问题标题】:Chat / Server client Python聊天/服务器客户端 Python
【发布时间】: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


【解决方案1】:

您正在正确初始化Thread 对象。尝试以下方法之一:

    Thread(target=clientHandler, args=(c,)).start()

    Thread(target=lambda c=c: clientHandler(c)).start()

Thread 将可调用对象作为target 参数。您的代码不会传入可调用对象,而是调用 clientHandler,并将其返回值传递给 Thread.__init__

【讨论】:

  • 嘿,我试过这个,它抛出了一条错误消息,说“args =”来自python 2.7版。我必须使用 python 3.4 来完成我的作业。你还有什么想法吗??谢谢:)
  • 错误信息究竟是什么?根据the docsargs 在 Python 3.4 中有效。另外,我测试了 Python 3.4 中的变化。
  • @MarkNicholls - 我仍然声称args 应该可以工作,但请查看我的编辑以寻找替代方案。
  • 我都试过了,他们都回来了:无法启动新线程错误。还有什么想法吗?
  • 错误消息的确切文本是什么?请复制并粘贴错误信息,不要尝试重新输入。
【解决方案2】:

server.py 的更改代码对我有用。 如果我们在线程处理程序中接受连接并在调用处理程序时将套接字对象作为参数传递会怎样。

def clientHandler(s):
    while True:
        c, addr = s.accept()
        print("Connection from: " + str(addr))
        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()

在主函数中,我更改了以下几行。

while True:
    #c, addr = s.accept()
    #print("Connection from: " + str(addr))
    Thread(target=clientHandler(s)).start()

这是连接结果:

>>> 
10.212.245.81:5000

Clients: 3
Connection from: ('10.212.245.81', 60945)
c1$hi
   Sending: hipPpc1
Connection from: ('10.212.245.81', 60976)
c2$hi
   Sending: hipPpc2
Connection from: ('10.212.245.81', 61096)
c3$hi
   Sending: hipPpc3

P.S 我没有尝试通过超过客户端连接请求数来检查代码。

【讨论】:

  • 只是一个奇怪的问题,你是在 MAC 还是 Windows 上完成的?谢谢你的帮助。
  • 您好,我已经尝试过了,但没有运气。当第一个客户端发送消息时,服务器会响应,但是当第二个客户端发回消息时,它没有响应。因此,当第一个客户端消息再次出现错误消息时:“valueerror: substring not found encoding python”。还有什么想法吗??
  • 这个答案仍然存在与原始答案相同的缺陷——它直接调用clieantHandler,而不是允许线程模块调用它。如其所写,此代码(和 OP)将 None 作为目标参数传递给 Thread()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2014-05-17
相关资源
最近更新 更多