2016-12-28 2 views
-2

Я новичок в golang, и я пишу приложение клиент-сервер через протокол TCP. Мне нужно сделать временное соединение, которое закроется через пару секунд. Я не понимаю, как это сделать.
У меня есть такая функция, которая создает соединение и ожидают данных выработанного пространства:Установите время для жизни соединения в Golang

func net_AcceptAppsList(timesleep time.Duration) { 
     ln, err := net.Listen("tcp", ":"+conf.PORT) 
     CheckError(err) 
     conn, err := ln.Accept() 
     CheckError(err) 
     dec := gob.NewDecoder(conn) 
     pack := map[string]string{} 
     err = dec.Decode(&pack) 
     fmt.Println("Message:", pack) 
     conn.Close() 
} 

Мне нужно, чтобы сделать эту функцию, чтобы ждать данных только несколько секунд - не навсегда.

ответ

2

Использование SetDeadline или SetReadDeadline

От net.Conn docs

// SetDeadline sets the read and write deadlines associated 
    // with the connection. It is equivalent to calling both 
    // SetReadDeadline and SetWriteDeadline. 
    // 
    // A deadline is an absolute time after which I/O operations 
    // fail with a timeout (see type Error) instead of 
    // blocking. The deadline applies to all future I/O, not just 
    // the immediately following call to Read or Write. 
    // 
    // An idle timeout can be implemented by repeatedly extending 
    // the deadline after successful Read or Write calls. 
    // 
    // A zero value for t means I/O operations will not time out. 
    SetDeadline(t time.Time) error 

    // SetReadDeadline sets the deadline for future Read calls. 
    // A zero value for t means Read will not time out. 
    SetReadDeadline(t time.Time) error 

    // SetWriteDeadline sets the deadline for future Write calls. 
    // Even if write times out, it may return n > 0, indicating that 
    // some of the data was successfully written. 
    // A zero value for t means Write will not time out. 
    SetWriteDeadline(t time.Time) error 

Если вы хотите Accept вызов тайм-аут, вы можете использовать метод TCPListener.SetDeadline.

ln.(*net.TCPListener).SetDeadline(time.Now().Add(time.Second)) 

При желании, вы могли бы таймер вызова Close() или CloseRead() на связи, или Close() на net.Listener, но это не оставит вас с более чистой тайм-аутом.

+0

Нет, это не то, что я хочу. Я видел эти функции, и я никогда не буду задавать этот вопрос, были ли эти функции тем, что я хочу. Эти функции просто устанавливают тайм-аут чтения или записи или обеих операций! Но если его нет, то ничего не происходит. –

+0

@IgniSerpens: тогда, пожалуйста, покажите пример того, что вам нужно. Вызов 'Decode' будет делать' Read' в соединении, поэтому это приведет к тому, что 'Decode' вернется после истечения срока. – JimB

+0

Нам нужно сделать тайм-аут для существующего соединения. –

-1

Как @JimB сказал в комментариях, нам нужно использовать еще один прослушиватель - net.TCPListener, который имеет метод SetDeadline, устанавливающий время жизни соединения, в то время как стандартный net.Listener его не имеет.

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