Go的net.Listener
界面如下所示:
type Listener interface {
// Accept waits for and returns the next connection to the listener.
Accept() (Conn, error)
// Close closes the listener.
// Any blocked Accept operations will be unblocked and return errors.
Close() error
// Addr returns the listener's network address.
Addr() Addr
}
但Addr
实际上用于什么?如果我必须实现我自己的监听器,它只返回一个空的Addr().String()
但接受和关闭的连接就好了,会有什么影响?
答案 0 :(得分:8)
某些网络协议允许您创建侦听随机地址的侦听器。当您想要同时运行多个服务实例时,通常会使用此方法,因此您无法全部监听同一地址。在这些情况下,内核会找到一个可用的内核,并将您的监听器放在那里。但是,一旦你有一个随机地址,你需要知道那个地址是什么,这样你就可以做广告。
例如,使用TCP& UDP,您可以指定0
作为您的端口号:
package main
import (
"fmt"
"net"
)
func main() {
l, _ := net.Listen("tcp4", ":0")
fmt.Printf("Addr: %s\n", l.Addr())
}
结果如下:
Addr: 0.0.0.0:37733
答案 1 :(得分:5)
为了添加到Patrick的答案,2009年6月在commit 5d2ee9d的Go1.0中添加了对{\ n}}接口的特定方法Addr()
。
当时的原因是:
将Addr()字符串添加到net.Listener接口。
使用它来避免在测试中使用固定端口。
这样net/server_test.go
可以监听任何可用的端口,并且仍然可以找回确切的地址。
Listener
if network == "tcp" {
listenaddr += ":0"; // any available port
}
go runServe(t, network, listenaddr, listening, done);
addr := <-listening; // wait for server to start
使用runServe()
方法通过频道返回地址:
Addr()