Найти - Пользователи
Полная версия: Сокеты: непонятно поведение клиента
Начало » Python для новичков » Сокеты: непонятно поведение клиента
1
alega
Сервер 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()

Сервер явно рассчитан на одно подключение. И всё работает как надо. Ради интереса я запускаю второй экземпляр клиента и жду, что на этапе подключения он свалится с ошибкой. Однако этого не происходит и он стабильно работает отправляя куда-то данные, которые сервер не получает (что ожидаемо).
Объясните пожалуйста подробно, что происходит при запуске второго клиента. Куда подключается и почему нет ошибок?
ayb
А ошибки и не должно быть. Сокет пытается соедениться с сервером, но он не знает что сервер принимает одно соединение. Решение - перед соеденением выставить таймаут, после соеденения убрать таймаут.
alega
ayb, но разве здесь:
tcp_socket.connect(("127.0.0.1", port))
не происходит обмен TCP пакетами для установлении связи (вроде три пакета: 1.туда,2.обратно,3.туда)? И сервер не должен отказать в соединении? Иными словами протокол TCP в состоянии дать понять клиенту что соединения нет и это должно произойти в tcp_socket.connect (он разве не блокирующий по умолчанию?).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB