• go tcp


    TCP编程

    1、客户端和服务器

    2、服务端的处理流程

    • 监听端口
    • 接收客户端的链接
    • 创建goroutine,处理该链接

    3、客户端的处理流程

    • 建立与服务端的链接
    • 进行数据收发
    • 关闭链接

     

    服务端代码

    package main
    
    import (
    	"fmt"
    	"net"
    )
    
    func main() {
    	fmt.Println("start server...")
    	listen, err := net.Listen("tcp", "0.0.0.0:50000")
    	if err != nil {
    		fmt.Println("listen failed, err:", err)
    		return
    	}
    	for {
    		conn, err := listen.Accept()
    		if err != nil {
    			fmt.Println("accept failed, err:", err)
    			continue
    		}
    		go process(conn)
    	}
    }
    func process(conn net.Conn) {
    	defer conn.Close()
    	for {
    		buf := make([]byte, 512)
    		n, err := conn.Read(buf)
    		if err != nil {
    			fmt.Println("read err:", err)
    			return
    		}
    
    		fmt.Printf(string(buf[0:n]))
    	}
    }
    

    客户端代码

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"net"
    	"os"
    	"strings"
    )
    
    func main() {
    
    	conn, err := net.Dial("tcp", "localhost:50000")
    	if err != nil {
    		fmt.Println("Error dialing", err.Error())
    		return
    	}
    
    	defer conn.Close()
    	inputReader := bufio.NewReader(os.Stdin)
    	for {
    		input, _ := inputReader.ReadString('
    ')
    		trimmedInput := strings.Trim(input, "
    ")
    		if trimmedInput == "Q" {
    			return
    		}
    		_, err = conn.Write([]byte(trimmedInput))
    		if err != nil {
    			return
    		}
    	}
    }
    

    发送http请求

    package main
    
    import (
    	"fmt"
    	"io"
    	"net"
    )
    
    func main() {
    
    	conn, err := net.Dial("tcp", "www.baidu.com:80")
    	if err != nil {
    		fmt.Println("Error dialing", err.Error())
    		return
    	}
    	defer conn.Close()
    	msg := "GET / HTTP/1.1
    "
    	msg += "Host:www.baidu.com
    "
    	msg += "Connection:keep-alive
    "
    	//msg += "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
    "
    	msg += "
    
    "
    
    	//io.WriteString(os.Stdout, msg)
    	n, err := io.WriteString(conn, msg)
    	if err != nil {
    		fmt.Println("write string failed, ", err)
    		return
    	}
    	fmt.Println("send to baidu.com bytes:", n)
    	buf := make([]byte, 4096)
    	for {
    		count, err := conn.Read(buf)
    		fmt.Println("count:", count, "err:", err)
    		if err != nil {
    			break
    		}
    		fmt.Println(string(buf[0:count]))
    	}
    }
    

      

  • 相关阅读:
    MySql设计表中的create_time和update_time字段
    java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
    Hbase问题:java.lang.RuntimeException: HRegionServer Aborted
    Elasticsearch 7.6.2 简单的api(springboot)
    idea + springboot 热部署
    kibana Elasticsearch cluster did not respond with license information.
    Elasticsearch7.6.2 搭建的坑
    数据库账号密码加密
    pg数据库,插入数据,若已存在则更新数据
    org.postgresql.util.PSQLException:这个 ResultSet 已经被关闭。
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/7503968.html
Copyright © 2020-2023  润新知