zoukankan      html  css  js  c++  java
  • 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]))
    	}
    }
    

      

  • 相关阅读:
    Guava集合-BiMap
    Guava 集合框架
    Guava 学习计划
    解决Gmail/GCalendar图标丢失问题
    Spring cloud系列之win10 下安装 ZooKeeper 的方法
    Spring cloud系列之Zuul配置项中sensitiveHeaders和ignoredHeaders
    Spring Cloud系列之客户端请求带“Authorization”请求头,经过zuul转发后丢失了
    错误:this is incompatible with sql_mode=only_full_group_by
    码云插件Gitee:Couldn't get the list of Gitee repositories
    Redis开发规范
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/7503968.html
Copyright © 2011-2022 走看看