zoukankan      html  css  js  c++  java
  • golang的socket服务端与客户端

    服务端

    服务端的处理流程

    1. 监听端口
    2. 接收客户端的链接
    3. 创建goroutine,处理该链接
    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)//创建goroutine,处理连接
        }
    }
    func process(conn net.Conn) {
        defer conn.Close()
        for {
            buf := make([]byte, 512)
            _, err := conn.Read(buf)
            if err != nil {
                fmt.Println("read err:", err)
                return
            }
            fmt.Println("read: ", string(buf))
        }
    }

    客服端

    客户端的处理流程

    1. 建立与服务端的链接
    2. 进行数据收发
    3. 关闭链接
    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 {
            fmt.Println("请发送信息(退出请输入Q):")
            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: close
    "//请求头部
        msg += "
    
    "//再下面是请求数据,这里没有携带数据
    
        _, err = io.WriteString(conn, msg)
        if err != nil {
            fmt.Println("write string failed, ", err)
            return
        }
        buf := make([]byte, 4096)
        for {
            count, err := conn.Read(buf)
            if err != nil {
                break
            }
            fmt.Println(string(buf[0:count]))
        }
    }
  • 相关阅读:
    Github 中使用认证签名
    临时邮箱
    devexpress 中的chart(图表)根据窗口大小缩放
    提交特殊字符取值的处理 HttpUtility.UrlEncode
    git 中 add 操作
    Linux随笔
    Oracle复杂多条件排序
    jdk内置工具jstack查询有问题代码(具体到哪一行)
    2018最新Web前端经典面试试题及答案
    打包bat
  • 原文地址:https://www.cnblogs.com/angelyan/p/10661502.html
Copyright © 2011-2022 走看看