【TCPListener类型】
TCPListener是一个TCP网络监听器,通常在服务端监听客户端发来的请求。其类型定义在tcpsock.go文件中。其本质是个网络文件描述符,与TCPConn类型一样。
type TCPListener struct {
fd *netFD
}
【net.ListenTCP函数】
func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error)
network 参数为 tcp tcp4 tcp6的一种
laddr为本机需要监听的 ip 和port,如果为nil或者未指定ip,则监听广播
函数返回一个*TCPlistener类型数据。
其同样定义在tcpsock.go中,源码如下
func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error) {
switch network {
case "tcp", "tcp4", "tcp6":
default:
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(network)}
}
if laddr == nil {
laddr = &TCPAddr{}
}
ln, err := listenTCP(context.Background(), network, laddr)
if err != nil {
return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: laddr.opAddr(), Err: err}
}
return ln, nil
}
net.ListenTCP函数经常与Accpt方法共同使用来实现服务端的监听功能。
tcpsock.go中的源码如下
func (l *TCPListener) Accept() (Conn, error) {
if !l.ok() {
return nil, syscall.EINVAL
}
c, err := l.accept()
if err != nil {
return nil, &OpError{Op: "accept", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
}
return c, nil
}
Accept()方法 作用在 *TCPListener上,返回一个通用的 Conn类型数据与客户端进行通讯。
【简单服务器搭建】
代码demo如下:
package main
import (
"fmt"
"net"
"os"
"time"
)
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error :", err.Error())
os.Exit(1)
}
}
func typeof(v interface{}) {
fmt.Printf("type is: %T\n", v)
}
func mytime() string {
return time.Now().String()
}
func main() {
service := ":2000" //设置服务器监听的端口
tcpAddr, err := net.ResolveTCPAddr("tcp", service) //创建 tcpAddr数据
checkError(err)
fmt.Println("tcpAddr ")
typeof(tcpAddr)
mylistener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
fmt.Println("mylistener ")
typeof(mylistener)
i := 0
for {
myconn, err := mylistener.Accept()
fmt.Printf("myconn ")
typeof(myconn)
if err != nil {
continue
}
i++
thistime := mytime()
fmt.Println("new request", i, " return time:", thistime)
myconn.Write([]byte(thistime))
myconn.Close()
}
}
重新打开一个终端,通过telnet 命令 发送请求
c$telnet localhost 2000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
2018-09-27 14:20:36.572002079 +0800 CST m=+14.509946392Connection closed by foreign host.
c$
服务端的显示如下
$./l_SimpleServer
tcpAddr
type is: *net.TCPAddr
mylistener
type is: *net.TCPListener
myconn type is: *net.TCPConn
new request 1 return time: 2018-09-27 14:20:26.492470619 +0800 CST m=+4.430414840
myconn type is: *net.TCPConn
new request 2 return time: 2018-09-27 14:20:35.004106912 +0800 CST m=+12.942051220
myconn type is: *net.TCPConn
new request 3 return time: 2018-09-27 14:20:36.572002079 +0800 CST m=+14.509946392