网络编程

71 阅读2分钟

网络编程

实现了一个简单的服务器/客户端通信demo

tcp/ip协议:网络层的ip协议和传输层的tcp协议

server

func f(c net.Conn){
    defer c.Close()
    for  {
        b := make([]byte, 1024)
        n, err := c.Read(b)  //阻塞等待输入
        if err!=nil{
            fmt.Println(err)
            return
        }
        fmt.Println(string(b[:n]))
    }
}
func main() {
    l, err := net.Listen("tcp", "0.0.0.0:8888") //监听本地8888端口
    if err != nil {
        fmt.Println(err)
        return
    }
    defer l.Close()
​
    for {
        c, err2 := l.Accept()   //阻塞等待客户端连接
        if err2 != nil {
            fmt.Println(err)
            return
        }else{
            fmt.Printf("客户端id:%v\n",c.RemoteAddr().String())
        }
        go f(c)
    }
}

client

func main() {
    c, err := net.Dial("tcp", "192.168.163.164:8888")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer c.Close()
    w := bufio.NewReader(os.Stdin) //终端输入
    for {
        s, err2 := w.ReadString('\n')
        if err2 != nil {
            fmt.Println(err2)
            return
        }
        s = strings.Trim(s, "\r\n")
        if s == "exit"{
            break
        }
        _, err3 := c.Write([]byte(s + "\n"))
        if err3 != nil {
            fmt.Println(err3)
            return
        }
    }
}

json

序列化

前提:变量可导出(首字母大写)

json:"name":改json字符串的字段名

指针变量:编码时自动转换为它所指向的值 (当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)

type Stu struct {
    Name  string `json:"name"`
    Age   int
    HIgh  bool
    sex   string
    Class *Class `json:"class"`   //Class Class
}
​
type Class struct {
    Name  string
    Grade int
}
​
func main() {
    //实例化一个数据结构,用于生成json字符串
    stu := Stu{
        Name: "张三",
        Age:  18,
        HIgh: true,
        sex:  "男",
    }
​
    //指针变量
    cla := new(Class)   //cla := Class{}
    cla.Name = "1班"
    cla.Grade = 3
    stu.Class=cla
​
    jsonStu, err := json.Marshal(stu)
    if err != nil {
        fmt.Println("生成json字符串错误")
    }
​
    //jsonStu是[]byte类型,转化成string类型便于查看
    fmt.Println(string(jsonStu))
}
//{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}

反序列化

    str := `{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}`
    var s Stu
    json.Unmarshal([]byte(str), &s)
    fmt.Printf("%+v %+v", s,*s.Class)
    //{Name:张三 Age:18 HIgh:true sex: Class:0xc000008150} {Name:1班 Grade:3}

文件操作

NewReader

    file, _ := os.Open("D:/t.txt")
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        str, err := reader.ReadString('\n')
        if err == io.EOF {
            // err 为 io.EOF 时,str 返回可能为 "",也可能非 ""
            if len(str) != 0 {
                fmt.Print(str)
            }
            break
        }
        fmt.Print(str)
    }

NewWriter

    file, _ := os.Create("D:/t.txt")
    defer file.Close()
    writer := bufio.NewWriter(file)
​
    // 写字节切片到缓存
    writer.Write([]byte{65, 66, 67})
​
    // 写单个字节到缓存
    writer.WriteByte('a')
​
    // 写单个字符到缓存
    writer.WriteRune('您')
​
    // 写字符串到缓存
    writer.WriteString("肥肠粉A")
​
    // 将缓存数据刷新到底层的 io.Writer 对象
    writer.Flush()
//ABCa您肥肠粉A