2013-03-18 3 views
2

Новичок здесь. Я пытаюсь создать простой TCP-сервер, это запросы процесса с использованием SocketServer. Так или иначе, метод handle() не вызван.Простой TCP-сервер в python

Версия: 2.4.3 на Linux

Вот соответствующий код:

#!/usr/bin/python -u 
import socket; 
import SocketServer 
import time; 
import threading; 
class EchoRequestHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     # Echo the back to the client 
     data = self.request.recv(1024) 
     self.request.send(data) 
     return 
class MyThreads(threading.Thread): 
    def __init__(self): 
     self.server = None; 
     threading.Thread.__init__(self); 
    def run(self): 
     if self.server == None: 
      address = ('localhost', 40000); 
      self.server = SocketServer.TCPServer(address, EchoRequestHandler); 
      # The following line partially fixed the problem 
      self.server.serve_forever(); 
if __name__ == '__main__': 
    thr = MyThreads(); 
    thr.setDaemon(True); 
    thr.start(); 
    # Connect to the server 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(('localhost', 40000)) 
    # Send the data 
    message = 'Hello, world' 
    print 'Sending : "%s"' % message 
    len_sent = s.send(message) 
    # Receive a response 
    print 'Sending : "%s"' % message 
    response = s.recv(len_sent) 
    print 'Received: "%s"' % response 

код создает сокет, я могу видеть его из командной строки с помощью NETSTAT. Но в отладчике (python -m pdb) я вообще не вижу код в методе run(). И handle() также не вызван. Поэтому он подключается к сокету, но ничего не получает.

+4

Вы посмотрели пример [здесь] (http://docs.python.org/2/library/socketserver.html)? Я не вижу вызова 'serve_forever()' в вашем коде. – larsks

+0

Кроме того, вам не нужны точки с запятой после операторов 'import'. – larsks

+0

Я знаю, это просто перенос от других привычек программирования. Я не могу понять, где использовать serve_forever() в этом коде. Я немного смущен. –

ответ

2

Для того, чтобы начать общение, необходимо позвонить по телефону serve_forever(), чтобы получить объект SocketServer. Метод serve_forever(), как следует из его названия, никогда не вернется. Учитывая этот факт, вы, вероятно, захотите назвать его в своем потоке, чтобы разрешить остальную часть вашего кода. Например:

class MyThreads(threading.Thread): 
    def __init__(self): 
     self.server = None; 
     threading.Thread.__init__(self); 
    def run(self): 
     if self.server == None: 
      address = ('localhost', 40000); 
      self.server = SocketServer.TCPServer(address, EchoRequestHandler); 

     self.server.serve_forever() 

Здесь вы можете столкнуться с условиями гонки, если ваш код клиента пытается подключиться до прослушивания сокета. Возможно, time.sleep(...) поможет вам здесь.

+0

Когда я пытаюсь отправить сообщение во второй раз, я получаю эту ошибку: Traceback (последний последний звонок): Файл «./testTCP.py», строка 47, в? response = s.recv (len_sent) socket.error: (104, 'Сброс соединения с помощью peer') –

+0

Спасибо за вашу помощь @larsks, я переписал код, как вы предлагали, и теперь он работает. –

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