2014-10-18 85 views
5

有关如何让这个接受多个客户的任何帮助,以及为什么它不是现在呢?谢谢!如何在TCP Python聊天服务器上拥有多个客户端?

另外,有什么我做错了这个代码?我一直在关注大多的Python 2个教程,因为我无法找到任何的Python 3.4

这里是我的服务器代码:

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 = data.decode("UTF-8") 

    message = str(data[:data.index("§")]) 
    nick = str(data[data.index("§")+1:]) 

     print(nick + ": " + message) 
     saveChat(nick, message) 
     print(" Sending: " + data) 
     c.send(bytes(data, "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) 
    for i in range(Clients): 
     c, addr = s.accept() 
     print("Connection from: " + str(addr)) 

     Thread(target=clientHandler(c)).start() 
    s.close() 

if __name__ == "__main__": 
    Main() 

这里是我的客户端代码:

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": 
     s.send(bytes(message + "ยง" + nick, "UTF-8")) 
     data = s.recv(1024) 
     data = data.decode("UTF-8") 
     data2 = data 

     messageServer = str(data[:data.index("ยง")]) 
     nickServer = str(data[data.index("ยง")+1:]) 
     if not data == data2: 
      print(nickServer + ": " + messageServer) 
     message = input("-> ") 
    s.close() 

if __name__ == "__main__": 
    Main() 

回答

8

首先,我发现这些教程非常有用:BinaryTides

这里是接受多个客户端一个简单的TCP服务器的例子。所有这些都会从客户端接收数据并返回“OK ..”+ the_data。但是,您可以轻松修改它,使其具有向所有连接的客户端广播数据(聊天消息)的功能。这个例子使用线程。你应该谷歌select模块。关于你的线程,你确定你是a)使用正确的模块/方法进行工作,b)你用正确的方式调用它?

import socket 
import sys 
from thread import start_new_thread 

HOST = '' # all availabe interfaces 
PORT = 9999 # arbitrary non privileged port 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
except socket.error, msg: 
    print("Could not create socket. Error Code: ", str(msg[0]), "Error: ", msg[1]) 
    sys.exit(0) 

print("[-] Socket Created") 

# bind socket 
try: 
    s.bind((HOST, PORT)) 
    print("[-] Socket Bound to port " + str(PORT)) 
except socket.error, msg: 
    print("Bind Failed. Error Code: {} Error: {}".format(str(msg[0]), msg[1])) 
    sys.exit() 

s.listen(10) 
print("Listening...") 

# The code below is what you're looking for ############ 

def client_thread(conn): 
    conn.send("Welcome to the Server. Type messages and press enter to send.\n") 

    while True: 
     data = conn.recv(1024) 
     if not data: 
      break 
     reply = "OK . . " + data 
     conn.sendall(reply) 
    conn.close() 

while True: 
    # blocking call, waits to accept a connection 
    conn, addr = s.accept() 
    print("[-] Connected to " + addr[0] + ":" + str(addr[1])) 

    start_new_thread(client_thread, (conn,)) 

s.close() 
+0

我得到的错误'导入错误:没有模块名为“thread''尝试做进口的时候'start_new_thread' – artman41 2014-10-19 14:02:21

+0

啊我看,看在这里,这可能会对此有所了解。 https://stackoverflow.com/questions/5568555/thread-vs-threading – Totem 2014-10-19 17:46:28

+0

啊,谢谢你的信息@Totem – artman41 2014-10-21 10:10:30

2

退房时间:http://etutorials.org/Programming/Python+tutorial/Part+IV+Network+and+Web+Programming/Chapter+19.+Sockets+and+Server-Side+Network+Protocol+Modules/19.3+Event-Driven+Socket+Programs/。示例19-6(与select系统调用一起)就像聊天应用程序的问候世界。您可能还想看看http://beej.us/guide/bgnet/output/html/multipage/index.html以获取更低级别(C)洞察系统联网基础知识。

+0

谢谢大家的帮助,现在要检查他们:) – artman41 2014-10-18 23:05:43