golang实现tcp通信例子

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

内容简介: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
        }
    }
}

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

查看所有标签

猜你喜欢:

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

C和指针

C和指针

Kenneth A.Reek / 徐波 / 人民邮电出版社 / 2008 年4月 / 65.00元

本书提供与C语言编程相关的全面资源和深入讨论。本书通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。 全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答。 本书适合C语言初学者和初级C程序员阅读,也可作......一起来看看 《C和指针》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具