Python套接字 - 多个客户端

时间:2015-10-07 21:52:57

标签: python multithreading sockets tcp

首先作为免责声明:我不是Python(或一般编程)中最伟大的。

话虽如此,我遇到了Python套接字的问题。我正在尝试构建一个简单的聊天客户端/服务器程序,但是,我无法让服务器将从一个客户端的套接字收到的相应消息发送给其他连接的客户端。

这是服务器代码:

#!/usr/bin/python
import socket
import fnmatch
import thread

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
## Allow socket to be reused by application - doesn't force timeout.
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = socket.gethostname()
port = 9000
serverSocket.bind((host,port))

connectedUsers = []

serverSocket.listen(5)


def threadedClient(clientStream):
        while True:
                clientMessage = clientStream.recv(1024).decode()
                print clientMessage
                if "Username:" in clientMessage:
                        username = clientMessage.replace("Username:","")
                        print str(username) + " has connected!"
                        connectedUsers.append(clientAddress)
                        print str(username) + "" + str(clientAddress) + " has connected to server"
                        for users in connectedUsers:
                                clientStream.sendto(str(username) + " has connected!", users)
                if "Text:" in clientMessage:
                        receievedText = clientMessage.replace("Text:","")
                        for users in connectedUsers:
                                clientStream.sendto(receievedText.encode(), users)
                                print "Sending message " + str(receievedText) +" to:" + str(users)
                if not clientMessage:
                        break



while True:
        clientStream, clientAddress = serverSocket.accept()
        thread.start_new_thread(threadedClient,(clientStream,))

以下是客户端代码:

#!/usr/bin/python

import socket

clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 9000

username = raw_input("Please enter username: ")

clientSocket.connect((host, port))
clientSocket.send("Username:" + username)

def receiveServerMessage():
    serverMessage = clientSocket.recv(1024).decode()
    print serverMessage + '\n'


while True:
    receiveServerMessage()
    command = raw_input(username + " > ")
    if command != None:
        clientSocket.send("Text:" + str.encode(command))
    if command == str("q"):
        exit()
clientSocket.close()

尝试将消息发送到其他连接的客户端时,迭代似乎是错误的。我不确定“sendto”是否是处理这种情况的正确方法...特别是因为我认为它是基于UDP的。有关如何正确处理套接字流的任何建议吗?

1 个答案:

答案 0 :(得分:1)

问题是客户端在收听服务器套接字之前正在监听键盘输入,解决此问题的最佳方法是使用类似于 select()的 select() 在c 这是一个很好的例子https://pymotw.com/2/select/