2014-04-10 3 views
0

Я хочу реализовать параллельный сервер. Сервер должен одновременно использовать более одного клиента. Чтобы клиент мог отправлять сообщения на сервер.Параллельный сервер в Python

Серийный сервер работает потрясающе. Я могу подключиться, написать, закрыть и снова подключиться, без проблем. Теперь я хочу реализовать потоки. Так что: для каждого нового клиента должен быть новый поток, который обрабатывает TCP-сокет с одним клиентом.

Мой код для последовательного сервера:

#!/usr/bin/python   # This is server.py file 

import socket    # Import socket module 
import time 

while True: 
    s = socket.socket()   # Create a socket object 
    host = socket.gethostname() # Get local machine name 
    port = 12345    # Reserve a port for your service. 
    s.bind((host, port))  # Bind to the port 

    s.listen(5)     # Now wait for client connection. 

    c, addr = s.accept()  # Establish connection with client. 
    print 'Got connection from', addr 
    c.send('Please wait...') 
    time.sleep(2) 
    c.send('Thank you for connecting with your admin. Please write now.') 

    while True: 
     msg = c.recv(1024) 
     if not msg: 
     s.close() 
     break 
     elif msg == "close1234567890": 
     print ("Connection with %s was closed by the client." % (addr[0])) 
     else: 
     print "%s: %s" % (addr[0], msg) 

Мой TRY для параллельного сервера:

import socket    
import time 
import thread 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = socket.gethostname() 
s.bind((host, 50999))  
s.listen(5)     

def session(conn, addr): 
    while True: 
     print 'Got connection from', addr 
     conn.send('Please wait...') 
     time.sleep(2) 
     conn.send('Thank you for connecting with your admin. Please write now.') 

     while True: 
     msg = conn.recv(1024) 
     if not msg: 
      s.close() 
      break 
     elif msg == "close1234567890": 
      print ("Connection with %s was closed by the client." % (addr[0])) 
     else: 
      print "%s: %s" % (addr[0], msg) 

while True: 
    conn, addr = s.accept() 
    try: 
     thread.start_new_thread(session(conn, addr)) 
    finally: 
     s.close() 

Ошибка: Я запустить сервер, не вероят. Затем я запускаю Клиент, и все нормально. Я могу писать, а сообщения распечатываются сервером. Затем я запускаю второй клиент, но в этих окнах ничего не происходит. Нет возможности писать со второго клиента.

Sry, я абсолютно начинающие нитки;)

ответ

1

Это потому, что вы s.close() сокет. Вот модифицированный код:

def session(conn, addr): 
    while True: 
     print 'Got connection from', addr 
     conn.send('Please wait...') 
     time.sleep(2) 
     conn.send('Thank you for connecting with your admin. Please write now.') 

     while True: 
      msg = conn.recv(1024) 
      if not msg: 
       conn.close() 
       break 
      elif msg == "close1234567890": 
       print ("Connection with %s was closed by the client." % (addr[0])) 
      else: 
       print "%s: %s" % (addr[0], msg) 

while True: 
    conn, addr = s.accept() 
    thread.start_new_thread(session(conn, addr)) 

s.close() 

Я протестировал его и хорошо работал. BTW Я меняю ваш:

host = socket.gethostname() 
s.bind((host, 50999)) 

до s.bind(('localhost', 50999)). Я не уверен, почему вам нужно имя вашей машины, а исходный код вообще не работает - нет привязки имени узла к сокету.

+0

Sry, но он не работает для моего кода клиента. Возможно, это ошибка в клиенте. Я не думал, что мне тоже нужно обновить этот код. Но может быть ... – fuuman

+0

Он должен работать. Я не копировал и не вставлял весь ваш код. – laike9m

Смежные вопросы