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]))
    	}
    }
    

      

  • 相关阅读:
    解决“Kali Linux终端打不开”
    国内网站备案。备案的是域名?还是服务器?
    Linux磁盘分区
    Linux各目录的作用
    vim基础操作
    基础算法-->堆排序
    期望,方差,标准差,正态分布
    平面向量
    基础算法 ---> 二分法
    学习人工智能准备了解的算法
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/7503968.html
Copyright © 2011-2022 走看看