2014-10-18 14 views
5

Każda pomoc, w jaki sposób mogę uzyskać to, aby zaakceptować więcej niż jednego klienta, i dlaczego nie jest on w tej chwili? Dzięki!Jak mogę mieć wielu klientów na serwerze czatów TCP Python?

Czy coś jest nie tak z tym kodem? Śledzę głównie Python 2 tutoriale, ponieważ nie mogę znaleźć żadnego dla Pythona 3.4

Oto mój kod serwera:

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() 

I tu jest mój kod Klient:

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() 

Odpowiedz

8

Przede wszystkim, znalazłem te tutoriale bardzo pomocne: BinaryTides

Oto przykład prostego serwer TCP, który akceptuje wielu klientów. Wszystko to otrzymuje dane od klienta i zwraca "OK .." + dane_dane. Można go jednak łatwo zmodyfikować, aby posiadał funkcję, która transmituje dane (czat) do wszystkich podłączonych klientów. W tym przykładzie zastosowano wątkowanie. Musisz google dla modułu select. Co do twoich wątków, czy jesteś pewny, że: a) korzystasz z odpowiedniego modułu/metody do pracy i b) czy nazywasz to we właściwy sposó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

pojawia się błąd 'ImportError: No module o nazwie„thread'' gdy próbuje zrobić import do 'start_new_thread' – artman41

+0

Ah widzę, wygląd tutaj może to rzucić trochę światła na to. https://stackoverflow.com/questions/5568555/thread-vs-threading – Totem

+0

ah, dziękuję za informację @Totem – artman41

2

Sprawdź: 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/. Przykład: 19-6 jest (ten z wywoływaniem systemu select) jak cześć świat aplikacji czatu. Możesz również zapoznać się z http://beej.us/guide/bgnet/output/html/multipage/index.html, aby uzyskać więcej informacji na temat podstaw systemu niższego poziomu (C).

+0

Dziękuję za pomoc, będzie sprawdzić je teraz :) – artman41

Powiązane problemy