[Go]TCP服务中读写进行协程分离

读写两部分进行一下分离,中间通过chan进行传递数据 ,这样可以方便的在write中进行一些业务处理

 

single/snet/tcpconn.go

package snet

import (
    "bufio"
    fmtlognet"
)

type Conn struct {
    IP       string
    Port     uint32
    TCPConn  *net.TCPConn
    MsgChan  chan []byte
    ExitChan chan bool
    Closed   
}

func NewConn(IP string,Port uint32) *Conn {
    s := &Conn{
        IP:   IP,Port: Port,MsgChan:make(chan []),ExitChan: make(chan Conn) Start() {
    log.Printf(%s:%d start...\n,c.IP,c.Port)
    go func() {
        addr,err := net.ResolveTCPAddr(tcp4",fmt.Sprintf(%s:%dif err != nil {
            log.Println(resolve tcp addr err listen tcp err 0
        for {
            conn,err := listener.AcceptTCP()
             nil {
                log.Println(accept tcp err  conn
            go c.StartRead()
            go c.StartWrite()
            connid++
        }
    }()
    select {}
}
func (c *Conn) StartRead() {
    log.Println(read groutine is waiting)
    defer c.Stop()
    defer log.Println(read groutine exit)
    reader := bufio.NewReader(c.TCPConn)
     {
        lineBytes,err := reader.ReadBytes('\n')
        startread read bytes error len(lineBytes)
        line:=lineBytes[:len-1]
        log.Println(start read from client (line))
        go c.HandleMsg(line)
    }
}
func (c *Conn) StartWrite() {
    log.Println(write groutine is waiting)
    defer log.Println(write groutine exit)
     {
        case data := <-c.MsgChan:
            if _,err := c.TCPConn.Write(data); err !=startwrite conn write error start write from server (data))
        case <-c.ExitChan:
            return
        }
    }
}
func (c *Conn) HandleMsg(data []) {
    res := res:%s(data))


    c.MsgChan <- [](res)
}
func (c *Conn) Stop() {
    if c.Closed {
        return
    }
    c.Closed = true
    c.ExitChan <- 

    c.TCPConn.Close()
    close(c.ExitChan)
    close(c.MsgChan)
}

测试代码,使用上面的包:

server.go

package main

import single/snet
func main(){
    s:=snet.NewConn(0.0.0.08777)
    s.Start()
}

 

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1&#160;Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...