zoukankan      html  css  js  c++  java
  • Go复习之tcp粘包现象

    tcp客户端连续发生1000个json格式的学生信息字符串:

    import (
    	"encoding/json"
    	"fmt"
    	"log"
    	"net"
    	"strconv"
    )
    
    type student struct {
    	Name string `json:"name"`
    	Age  int `json:"age"`
    }
    
    func main() {
    	conn, e := net.Dial("tcp", "127.0.0.1:8888")
    	if e != nil {
    		log.Fatal(e.Error())
    		return
    	}
    	defer conn.Close()
    
    	//send
    	for i := 0; i < 1000; i++ {
    		stu := student{"name_" + strconv.Itoa(i), i}
    		bytes, e := json.Marshal(stu)
    		if e != nil {
    			log.Fatal(e.Error())
    			return
    		}
    		fmt.Println(string(bytes))
    
    		_, e = conn.Write(bytes)
    		if e != nil {
    			log.Fatal(e.Error())
    			return
    		}
    	}
    }
    

      tcp服务端每次读取1024个字节

    package main
    
    import (
        "fmt"
        "io"
        "log"
        "net"
    )
    
    func main() {
        l, e := net.Listen("tcp", ":8888")
        if e != nil {
            log.Fatal(e.Error())
            return
        }
        defer l.Close()
    
        for {
            conn, e := l.Accept()
            if e != nil {
                log.Fatal(e.Error())
                break
            }
            go handleConn(conn)
        }
    }
    
    func handleConn(conn net.Conn) {
        buf := make([]byte, 1024)
        for {
            n, err := conn.Read(buf)
            if err == io.EOF {
                fmt.Println("读取完毕。。。。。。")
                break
            } else if err != nil {
                fmt.Println(err.Error())
                break
            }
            fmt.Printf("n=%d,content=%s
    ", n, string(buf[:n]))
        }
    }

    每次读到的内容,出现粘包现象,如下:

  • 相关阅读:
    linux 免密登录
    mysql 重置从库
    elasticsearch原理及简介
    多线程编程--心得
    为什么我们做分布式使用Redis?
    JAVA-JVM调优
    JAVA-JVM调优标志
    Spirng-Mvc之Servlet篇
    Agent Job代理 执行SSIS Package
    Python之爬虫的理解
  • 原文地址:https://www.cnblogs.com/wanjch/p/11497961.html
Copyright © 2011-2022 走看看