php访问go tcp server,golang实现tcp通信例子

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

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值