ФорумПрограммированиеPython → Сокеты. клиент-сервер

Сокеты. клиент-сервер

  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 21 ноября 2009 г. 20:09

    решил написать клиент-сервер на питоне. Однако меньше писанины получилось чем на C++

    клиент

    import socket
    while 1:
       sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       sock.connect(("127.0.0.1", 7500))
       buf = raw_input('->Server ')
       sock.send(buf)
       result = sock.recv(1024)
       print "Server: ", result
       sock.close()


    сервер

    import socket, threading
    class MyThread(threading.Thread):
       def __init__(self, sock, addr):
           self.sock = sock
           self.addr = addr
           threading.Thread.__init__(self)
       def run ( self ):
           buf = self.sock.recv(1024)
           print "Client: ", buf
           self.sock.send(buf)
           self.sock.close()
    srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    srv.bind(("127.0.0.1", 7500))
    srv.listen(5)
    while 1:
       sock, addr = srv.accept()
       MyThread(sock,addr).start()


    но тут есть какаято трабла.. например при дисконекте клиента сервер какуюто ошибку пишет.
    завтра попробую разобраться
    Спустя 60 сек.
    зы сервер как вы можете заметить много поточный:)
    а изза этого собственно и трабла.. завтра…
    Спустя 24 сек.
    ну уже точнее сёдня)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 3:02, спустя 6 часов 52 минуты 59 секунд

    крут )
    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 3:24, спустя 22 минуты 33 секунды

    ну нормальная обработка дисконнектов - дело тонкое :)

    пока на грабли 100 раз не наступишь в этом деле, не поймешь :)
    Спустя 17 сек.
    вот клиентский сокет всегда знает что его отбросило а серверный … не всегда)
    Сапожник без сапог
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 22 ноября 2009 г. 4:17, спустя 52 минуты 40 секунд

    да точно. код ошибки 10054 - WSACONNECTRESET - Connection reset by peer
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 22 ноября 2009 г. 5:02, спустя 45 минут 15 секунд

    вот сделал. по команде exit со стороны сервера клозится сокет ну и поток завершается. да и вообще теперь все более правильно, т.к. в примере выше на каждую мессагу создаётся поток :) а тут создаётся поток на целую сессию месаг и в клиенте на каждую мессагу новый сокет был… а терь 1 на сессию

    клиент

    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(("127.0.0.1", 7500))
    while 1:
    buf = raw_input('->Server ')
    sock.send(buf)
    result = sock.recv(1024)
    print "Server: ", result
    sock.close()


    сервер
    import socket, threading
    class MyThread(threading.Thread):
    def __init__(self, sock, addr):
    self.sock = sock
    self.addr = addr
    threading.Thread.__init__(self)
    def run ( self ):
    while 1:
    buf = self.sock.recv(1024)
    if buf=='exit':
    break
    print "Client: ", buf
    self.sock.send(buf)
    self.sock.close()
    srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    srv.bind(("127.0.0.1", 7500))
    srv.listen(5)
    while 1:
    sock, addr = srv.accept()
    MyThread(sock,addr).start()
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 5:28, спустя 25 минут 40 секунд

    ужас)
    Сапожник без сапог
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 22 ноября 2009 г. 5:39, спустя 11 минут 16 секунд

    phpdude, напиши ему на C#, пусть знает что такое красивый язык))
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 22 ноября 2009 г. 5:48, спустя 8 минут 37 секунд

    на этом красивом языке раза в 2 больше кода получится)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 5:48, спустя 16 секунд


    на этом красивом языке раза в 2 больше кода получится)
    колво не главный показатель
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 5:48, спустя 39 секунд

    помоему ты перемудрил с while 1
    хоть бы там задержка какая была чтоли…
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 5:52, спустя 3 минуты 12 секунд


    помоему ты перемудрил с while 1
    хоть бы там задержка какая была чтоли…
    задержку создает srv.accept()

    это подвешивает основной процесс до коннекта :)

    так всегда пишется, ну только с одним условием

    while(!this.disconnecting)
    {
    client = sock.accept();
    }

    чтобы при состоянии дропа соединений и закрытия сокета как бы не создавать дополнительных ошибок :)
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 6:04, спустя 12 минут 28 секунд

    ништяк, осталось смирится с табами и можно изучать
  • Mr.Pihto

    Сообщения: 1386 Репутация: N Группа: Адекваты

    Spritz 22 ноября 2009 г. 6:23, спустя 18 минут 39 секунд

    я на телефон клиент скинул… прикольно :) только raw_input не работает почему то.. хотя из интерактивной консоли работает.. вобще я просто сделал так чтоб мессага слалась.. все работает )
    Спустя 111 сек.
    только сервер на C++ юзал ибо сервер на питоне чет не открывает порты :(
    всмысле в роутере они открыты но когда чекаеш их то только под нагрузкой пишет что открыты.. так вот под С== сервером открыты а под питоном нет.. странно
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 22 ноября 2009 г. 6:23, спустя 11 секунд

    CTAPbIu_MABP, хм, явы уже мало ?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 22 ноября 2009 г. 6:31, спустя 8 минут 24 секунды

    Troy, знаний много не бывает

Пожалуйста, авторизуйтесь, чтобы написать комментарий!