golang实现tcp通信例子

栏目: Go · 发布时间: 6年前

内容简介:tcp/udp ip通信是当前重要的通信方式。当然对于golang开发者而言,实现tcp通信也是必要的。本文的内容主要是基于《Go语言四十二章经》简书地址:本文的例子分为服务端与客户端两部分:

tcp/udp ip通信是当前重要的通信方式。

当然对于golang开发者而言,实现tcp通信也是必要的。本文的内容主要是基于《Go语言四十二章经》简书地址: https://www.jianshu.com/nb/29056963 的详细讲解

本文的例子分为服务端与客户端两部分:

服务端:

package main

import (
    "bufio"
    "fmt"
    "io"
    "net"
    "time"
)

//tcp server 服务端代码

func main() {
    //定义一个tcp断点
    var tcpAddr *net.TCPAddr
    //通过ResolveTCPAddr实例一个具体的tcp断点
    tcpAddr,_ = net.ResolveTCPAddr("tcp","127.0.0.1:9999")
    //打开一个tcp断点监听
    tcpListener,_ := net.ListenTCP("tcp",tcpAddr)
    defer tcpListener.Close()
    fmt.Println("Server ready to read ...")
    //循环接收客户端的连接,创建一个协程具体去处理连接
    for{
        tcpConn,err := tcpListener.AcceptTCP()
        if err!=nil {
            fmt.Println(err)
            continue
        }
        fmt.Println("A client connected :" +tcpConn.RemoteAddr().String())
        go tcpPipe(tcpConn)
    }
}
//具体处理连接过程方法
func tcpPipe(conn *net.TCPConn){
    //tcp连接的地址
    ipStr := conn.RemoteAddr().String()

    defer func() {
        fmt.Println(" Disconnected : " + ipStr)
        conn.Close()
    }()

    //获取一个连接的reader读取流
    reader := bufio.NewReader(conn)
    i:=0
    //接收并返回消息
    for {
        message,err := reader.ReadString('\n')
        if err!=nil || err == io.EOF {
            break
        }
        fmt.Println(string(message))

        time.Sleep(time.Second*3)

        msg := time.Now().String() + conn.RemoteAddr().String() + " Server Say hello! \n"

        b := []byte(msg)

        conn.Write(b)

        i++

        if i>10 {
            break
        }
    }
}

客户端

package main

import (
    "bufio"
    "fmt"
    "io"
    "net"
    "time"
)

func main() {
    var tcpAddr *net.TCPAddr
    tcpAddr,_ = net.ResolveTCPAddr("tcp","127.0.0.1:9999")

    conn,err := net.DialTCP("tcp",nil,tcpAddr)

    if err!=nil {
        fmt.Println("Client connect error ! " + err.Error())
        return
    }

    defer conn.Close()

    fmt.Println(conn.LocalAddr().String() + " : Client connected!")

    onMessageReceived(conn)
}

func onMessageReceived(conn *net.TCPConn) {

    reader := bufio.NewReader(conn)
    b := []byte(conn.LocalAddr().String() + " Say hello to Server... \n")
    conn.Write(b)
    for {
        msg, err := reader.ReadString('\n')
        fmt.Println("ReadString")
        fmt.Println(msg)

        if err != nil || err == io.EOF {
            fmt.Println(err)
            break
        }
        time.Sleep(time.Second * 2)

        fmt.Println("writing...")

        b := []byte(conn.LocalAddr().String() + " write data to Server... \n")
        _, err = conn.Write(b)

        if err != nil {
            fmt.Println(err)
            break
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UML参考手册

UML参考手册

兰博 / UML China / 机械工业出版社 / 2005-8 / 75.00元

《UML参考手册》在第1版的基础上进行了重大更新和扩展。UML的创建者James Rumbaugh、Ivar Jacobson和Grady Booch,清晰完整地讲述了UML的所有概念,包括对序列图、活动模型、状态机、组件、类和组件的内部结构以及特性描述的主要修订。手册式结构不仅有助于读者对UML的概念进行规范化的学习与理解,更为广大程序开发人员、系统用户和工程技术人员提供了方便快捷的查询方式。无......一起来看看 《UML参考手册》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具