【go语言 socket编程系列】TCPListener类型 及net.ListenTCP函数并搭建简单服务器

【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
 

你可能感兴趣的:(【go语言,socket编程系列】)