go tcp编程

 server

package main

import (
	"log"
	"net"
	"time"
)

func main() {
	// Part 1: 端口监听
	l, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatalf("Error listener returned: %s", err)
	}
	defer l.Close()

	// Part 2: 建立连接。
	for {
		c, err := l.Accept()
		//在开启监听成功之后,调用 net.Listener.Accept()方法等待 TCP 连接。
		//Accept 方法将以阻塞式地等待新的连接到达,并将该连接作为 net.Conn 接口类型返回。
		if err != nil {
			log.Fatalf("Error to accept new connection: %s", err)
		}

		//Part3: 创建协程,数据传输
		go func() {
			log.Printf("TCP session open")
			defer c.Close()

			for {
				d := make([]byte, 100)
				_, err := c.Read(d) // 将数据读到d中
				if err != nil {
					log.Printf("Error reading TCP session: %s", err)
					break
				}
				log.Printf("reading data from client: %s\n", string(d))
				_, err = c.Write(d)
				if err != nil {
					log.Printf("Error writing TCP session: %s", err)
					break
				}
			}
		}()
		// part4 强制关闭连接逻辑。启动一个新的 goroutine
		go func() {
			err := c.(*net.TCPConn).SetLinger(0)
			if err != nil {
				log.Printf("Error when setting linger: %s", err)
			}

			<-time.After(time.Duration(10) * time.Second)
			defer c.Close()
		}()
	}
}

client

package main

import (
	"log"
	"net"
)

func main() {
	// Part 1:建立连接
	c, err := net.Dial("tcp", "localhost:8000")
	if err != nil {
		log.Fatalf("Error to open TCP connection: %s", err)
	}
	defer c.Close()

	// Part2: 写入数据
	log.Printf("TCP session open")
	b := []byte("Hi, gopher?")
	_, err = c.Write(b)
	if err != nil {
		log.Fatalf("Error writing TCP session: %s", err)
	}

	// Part3: 读取数据
	for {
		d := make([]byte, 100)
		_, err := c.Read(d)
		if err != nil {
			log.Fatalf("Error reading TCP session: %s", err)
		}
		log.Printf("reading data from server: %s\n", string(d))
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值