Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 20, 2016 02:50:50

alega
Зарегистрирован: 2015-03-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокеты: непонятно поведение клиента

Сервер server.py:

import socket as s
def main():
    port = 1119
    buffer_size = 1024
    tcp_socket = s.socket(s.AF_INET, s.SOCK_STREAM)
    tcp_socket.bind(("", port))
    tcp_socket.listen(1)  # МАКСИМУМ ОДНО СОЕДИНЕНИЕ
    conn, addr = tcp_socket.accept()
    print addr
    while True:
        text = conn.recv(buffer_size).decode('ascii')
        if text == 'STOP SERVER':
            break
        if text:
            print text
    conn.close()
    tcp_socket.close()
if __name__ == '__main__':
    main()

Клиент client.py:
import socket as s
def main():
    port = 1119
    buffer_size = 1024
    tcp_socket = s.socket(s.AF_INET, s.SOCK_STREAM)
    try:
        tcp_socket.connect(("127.0.0.1", port))   # ТУТ ОЖИДАЮ ОШИБКУ ПРИ ВТОРОМ ЗАПУСКЕ
    except Exception as e:
        print 1, e.message
        return
    try:
        while True:
            msg = raw_input("message: ")
            if not msg:
                break
            tcp_socket.send(msg.encode('ascii'))
    except Exception as e:
        print 2, e.message
    finally:
        tcp_socket.close()
    tcp_socket.close()
if __name__ == '__main__':
    main()

Сервер явно рассчитан на одно подключение. И всё работает как надо. Ради интереса я запускаю второй экземпляр клиента и жду, что на этапе подключения он свалится с ошибкой. Однако этого не происходит и он стабильно работает отправляя куда-то данные, которые сервер не получает (что ожидаемо).
Объясните пожалуйста подробно, что происходит при запуске второго клиента. Куда подключается и почему нет ошибок?

Офлайн

#2 Апрель 20, 2016 05:01:35

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Сокеты: непонятно поведение клиента

А ошибки и не должно быть. Сокет пытается соедениться с сервером, но он не знает что сервер принимает одно соединение. Решение - перед соеденением выставить таймаут, после соеденения убрать таймаут.

Офлайн

#3 Апрель 20, 2016 06:23:22

alega
Зарегистрирован: 2015-03-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокеты: непонятно поведение клиента

ayb, но разве здесь:

tcp_socket.connect(("127.0.0.1", port))
не происходит обмен TCP пакетами для установлении связи (вроде три пакета: 1.туда,2.обратно,3.туда)? И сервер не должен отказать в соединении? Иными словами протокол TCP в состоянии дать понять клиенту что соединения нет и это должно произойти в tcp_socket.connect (он разве не блокирующий по умолчанию?).

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version