TCP服务端

TCP-cs模型- server端 实现流程:

  1. 创建监听器
  2. 启动监听
  3. 读客户端数据
  4. 写数据给客户端
  5. 读写goroutine创建和处理资源的释放
创建监听器

func Listen(network, address string)(Listener, error)

  • 参数network:协议,为tcp、udp(小写)。
  • 参数 address:IP地址和port端口。 “127.0.0.1:8000” ,其中端口取值建议大于4000 ,上限65535。
  • 返回值:监听器Listener类型。
启动监听

启动监听,成功创建tcp连接后返回一个Conn类型的变量。
func (Listener)Accept() (Conn, error) //造成阻塞
Conn是一个接口类型

type Conn interface {
  Read()
  Write()
  Close()
}
读客户端数据
//读取数据的缓冲区
buf := make(byte[], 4096)
for {
	n, err := conn.Read(buf)
	if err != nil && err != io.EOF {
		fmt.Println("conn read err:", err)
		return
	}
	if n == 0 {
		isQuit <- true
		fmt.Println("连接关闭!")
		return
	}
	alive <- true
	//处理数据
	fmt.Println(string(buf(:n)))
	//将数据传入通道
	chs <- buf[:n]
}
从通道得到数据,将数据写给客户端
//通道关闭,则循环结束
for msg := range chs {
	conn.write
}
控制goroutine,关闭资源
alive := make(chan bool)
//有缓冲的isQuit是为了服务器主动关闭时,不让读goroutine阻塞在通道isQuit上
isQuit := make(chan bool, 1)
defer conn.Close()
go readFromClient()
go writeToClient()
//超时则将客户端踢下线
//客户端关闭连接
select {
	//读goroutine收到客户端结束的信息,向通道isQuit传递信息
	case <-isQuit:
		//关闭该客户端的channel通道,从而关闭写goroutine
		close(chs)
		//删除客户端信息
		delete(client)
		//结束,defer会关闭conn
		return
	case <-alive:
	case <-time.After( time.Second * 60 ):
		//关闭该客户端的channel通道
		close(chs)
		//删除客户端信息
		//结束,defer会关闭conn,读goroutine会结束
		return
}

处理资源关闭总结:资源关闭一般由控制goroutine来处理。读goroutine是由控制goroutine关闭conn连接而关闭,写goroutine是由控制goroutine关闭通道chs而关闭。客户端主动关闭连接,由读goroutine通知控制goroutine。服务器主动关闭,关闭通道来关闭写goroutine,关闭连接来关闭写goroutine。

你可能感兴趣的:(golang网络编程和文件处理)