go语言 tcp eof_Go语言TCP网络通信

1cba3f1944c40d3a75ad3e67c40c1d8d.png

TCP 工作在网络的传输层,它属于一种面向连接的可靠的通信协议。

TCP 服务器的工作过程:

  1. TCP 服务器首先注册一个公知端口,然后调用 Listen() 函数在这个端口上创建一个 TCPListener 监听对象,并在该对象上监听客户机的连接请求。
  2. 启用 TCPListener 对象的 Accept() 方法接收客户机的连接请求,并返回一个协议相关的 Conn 对象,这里就是 TCPConn 对象。
  3. 如果返回了一个新的 TCPConn 对象,服务器就可以调用该对象的 Read() 方法接收客户机发来的数据,或者调用 Write() 方法向客户机发送数据了。

主程序

package mainimport(    "server")func main()  {        server := server.NewServer(":8000");      server.Start();}

服务端定义

package serverimport (     "log"    "net"    "os")type Server struct {    Address   string }func NewServer(address string) *Server{    return &Server{        Address: address,    }}// 开启TCP服务func (this *Server) Start(){        l, err := net.Listen("tcp", this.Address);    checkError(err)    defer l.Close()    log.Printf("Server start: %s", this.Address)    for {        conn, err := l.Accept()        if err != nil {            log.Println(err.Error())            continue        }        go handleConnection(conn);    }}// 连接接收func handleConnection(conn net.Conn){        rAddr := conn.RemoteAddr()    log.Printf("Connect from client: %s", rAddr)   defer conn.Close()    _, err := conn.Write([]byte("Welcome client"))    if err != nil {      return    }    input := bufio.NewScanner(conn)    for input.Scan() {       msg := input.Text()       log.Println("Receive from client", rAddr.String(), msg)    }}func checkError(err error) {    if err != nil {        log.Printf("Fatal error %s", err.Error())        os.Exit(1)    }}

客户端测试

客户端的工作过程如下:

  1. TCP 客户机在获取了服务器的服务端口号和服务地址之后,可以调用 DialTCP() 函数向服务器发出连接请求,如果请求成功会返回 TCPConn 对象。
  2. 客户机调用 TCPConn 对象的 Read() 或 Write() 方法,与服务器进行通信活动。
  3. 通信完成后,客户机调用 Close() 方法关闭连接,断开通信链路。
package mainimport(    "fmt"    "net"    "os")func main() {    var buf [512]byte    if len(os.Args) != 2 {        fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0])    }    service := os.Args[1]    tcpAddr, err := net.ResolveTCPAddr("tcp", service)    checkError(err)    conn, err := net.DialTCP("tcp", nil, tcpAddr)    checkError(err)      rAddr := conn.RemoteAddr()      n, err := conn.Write([]byte("Hello server"))    checkError(err)      n, err = conn.Read(buf[0:])    checkError(err)    fmt.Println("Reply form server", rAddr.String(), string(buf[0:n]))      conn.Close()    os.Exit(0)}func checkError(err error) {    if err != nil {        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())        os.Exit(1)    }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值