Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SocketServer: почему закрываются сокеты? 
:(
    Опции темы
dipsy
Дата 19.1.2010, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 13.1.2005
Где: Нижний Новгород

Репутация: нет
Всего: нет



Хочу сделать tcp-сервер. Основываюсь на примерах их документации. Код сервера:
Код

# -*- coding: utf-8 -*-

import SocketServer
from threading import Timer
f = open( '1.out', 'w' )
class F(object):
    def __init__(self, f):
        self.f = f

    def write(self, x):
        self.f.write(str(x)+"\n")
        self.f.flush()
f = F(f)

class MySocket(object):
    connList = []
    def __init__(self, socket):
        self.sock = socket
        self.connList.append(socket)
        data = socket.recv(1024).strip()
        socket.send(data.upper())
        print self.connList

    @classmethod
    def hello(cls):
        for conn in cls.connList:
            try:
                conn.send("11111111")
            except Exception, e:
                print repr(conn)
        if not cls.connList:
            f.write( "connList is empty" )
        run()

    @classmethod
    def temp(cls):
        MySocket.connList[0].send('000000')

def run():
    t = Timer(2.0, MySocket.hello)
    t.start()
run()
t = Timer(4.0, MySocket.temp)
t.start()

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        MySocket(self.request)

HOST, PORT = "", 9999 
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()


Код клиента:
Код

# -*- coding: utf-8 -*-
import socket
HOST, PORT = "localhost", 9999
data = "hello from Python client"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

x = '1'
sock.send(data + "\n")
while 1:
    received = sock.recv(1024)
    if received:
        print "Received: %s" % received

sock.close()

сначала запускаю файл сервера, потом код клиента. клиент отображает:
Received: HELLO FROM PYTHON CLIENT

потом срабатывает таймер и на "сервере" возникает ошибка:
Код
Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\python25\lib\threading.py", line 486, in __bootstrap_inner
    self.run()
  File "C:\python25\lib\threading.py", line 663, in run
    self.function(*self.args, **self.kwargs)
  File "Server.py", line 27, in hello
    conn.send("11111111")
  File "C:\Python25\lib\socket.py", line 141, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: (9, 'Bad file descriptor')

на сколько понимаю, ошибка в том, что соединение закрылось. не понимаю, почему оно закрылось.
как сделать, чтобы оно осталось открытым?
PM MAIL WWW   Вверх
Karadul
Дата 1.2.2010, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Код

    @classmethod
    def hello(cls):


А оно чем-то отличается от просто def hello(cls) ?
PM MAIL   Вверх
dipsy
Дата 1.2.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 13.1.2005
Где: Нижний Новгород

Репутация: нет
Всего: нет



у def hello(cls) на вход в cls придёт объект (self), а если указан @classmethod, то придёт класс. тот же самый, который был бы доступен по self.__class__
PM MAIL WWW   Вверх
Karadul
Дата 1.2.2010, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



И куда он придет, т.е. как к нему обращаться, если в аргументах его нет?
PM MAIL   Вверх
dipsy
Дата 2.2.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 13.1.2005
Где: Нижний Новгород

Репутация: нет
Всего: нет



Код
>>> class MyClass1(object):
...     def test(self):
...             print repr(self)
... 
>>> class MyClass2(object):
...     @classmethod
...     def test(cls):
...             print repr(cls)
... 
>>> m1 = MyClass1()
>>> m2 = MyClass2()
>>> m1.test(); m2.test()
<__main__.MyClass1 object at 0xb7641a0c>
<class '__main__.MyClass2'>

PM MAIL WWW   Вверх
Karadul
Дата 4.2.2010, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Пардон, я cls не заметил.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.