2014-02-02 4 views
1

Я пытаюсь создать небольшую программу чата, которые подключаются два (или больше) компьютеров, поэтому я попытался это:Thread, Сеть и Python

import socket 

    tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

    tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) 

    tcpSocket.bind(("0.0.0.0",8000)) 

    tcpSocket.listen(3) 

    print "Waiting for a Client ... " 
    (client, (ip,sock)) = tcpSocket.accept() 

    print "Received connection from : ",ip 

    print "Starting ECHO output ..." 

    data = 'dump' 

    client.send("Enter you're name : ") 
    name=client.recv(1024) 
    name=name.strip() 

    while len(data) : 
     send_data = raw_input("Me : ") 
     try : 
      client.send("Server : "+send_data) 
      client.send("\n"+name+" : ") 
     except : 
      print "Connection lost !" 
      break 
     data = client.recv(2048) 
     data = data.strip() 
     print name+" : "+data 

    print "Closing connection ..." 
    client.close() 

    print "Shutting down server ..." 
    tcpSocket.close() 

И она работала хорошо, единственная проблема в том, что я не может подключить к серверу более одного компьютера! Я попытался с помощью модуля нити с помощью этого fonction:

import socket 
import thread 

def thread_send() : 



print "Received connection from : ",ip 

    print "Starting ECHO output ..." 

    data = 'dump' 

    client.send("Enter you're name : ") 
    name=client.recv(1024) 
    name=name.strip() 

    while len(data) : 
     send_data = raw_input("Me : ") 
     try : 
      client.send("Server : "+send_data) 
      client.send("\n"+name+" : ") 
     except : 
      print "Connection lost !" 
      break 
     data = client.recv(2048) 
     data = data.strip() 
     print name+" : "+data 


tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) 

tcpSocket.bind(("0.0.0.0",8000)) 

tcpSocket.listen(5) 

print "Waiting for a Client ... " 

(client, (ip,sock)) = tcpSocket.accept() 

for i in range(5) : 

    thread.start_new_thread(thread_send,()) 

while True : 
    pass 

print "Closing connection ..." 
client.close() 

print "Shutting down server ..." 
tcpSocket.close() 

Но это не работает:/

+0

Где ваша программа водителя, которая вызывает эту функцию? В принципе, вы вызываете «принимать» в основном потоке и передаете новое соединение/сокет в новый поток. – Arunmu

+0

Хорошо спасибо, поэтому я попытался вызвать «принять» вне функции, но теперь клиент подключается к пяти потокам, но я хочу, чтобы 5 клиентов подключились к одному серверу:/(я редактировал сообщение, чтобы показать весь код!) –

+0

Нет, это не работает. 1) Запустите цикл accept in while (для нескольких клиентов). # 2) Каждый раз, когда вы принимаете возврат, начинаете новый поток и передаете ему новый сокет (клиент) и другие необходимые данные (ip и носок). # 3) Как закончить нить, обслуживающую соединение, зависит от вашего пути. – Arunmu

ответ

-1

Ниже приведен пример того, как вы это делаете. Извините, я не тестировал этот код и не запускал его для проверки какой-либо проблемы синтаксиса, это просто для того, чтобы дать представление.

 

def thread_send(cli_sock): 
    data = 'dump' 

    cli_sock.send("Enter you're name : ") 
    name=cli_sock.recv(1024) 

    if len(name) == 0: ## If client disconnected or terminated 
     return 

    name=name.strip() 

    while len(data) : 
     send_data = raw_input("Me : ") 
     try : 
      cli_sock.send("Server : "+send_data) 
      cli_sock.send("\n"+name+" : ") 
     except : 
      print "Connection lost !" 
      break 
     data = client.recv(2048) 
     data = data.strip() 
     print name+" : "+data 



serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
serv_sock.bind(('localhost', 8080)) 
serv_sock.listen(1) 
print "After listen...waiting for accept\n" 
try: 
    while True: 
     client_sock, address = serv_sock.accept() 
     print "Connection accepted\n" 
     thread.start_new_thread(thread_send, (client_sock)) 
finally: 
    serv_sock.close()