Golang学习记录-HTTP和TCP编程

Golang学习记录-HTTP和TCP编程

前言

基于目前对于go语言的认识以及最近一段时间暂不找工作,决定使用go语言做一款im server。那么,先学一下怎么使用go进行http编程和tcp编程吧。

参考资料:
《Golang标准库文档》https://studygolang.com/pkgdoc
GO语言使用之网络编程(TCP编程) https://blog.csdn.net/tdcqzd/article/details/82682632

Http-Server代码示例

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
)

// 我们模拟一个json数据返回
type ServerInfo struct {
    BackupIP string `json:"backupIP"`      // 注意,首字母需要大写,否则json序列化会失败!
    Code int `json:"code"`
    Discovery string `json:"discovery"`
    MsfsBackup string `json:"msfsBackup"`
    MsfsPrior string `json:"msfsPrior"`
    Msg string `json:"msg"`
    Port string `json:"port"`
    PriorIP string `json:"priorIP"`
}

// 执行main之前,会先执行init,这里可以做一些初始化操作
func init()  {
    log.SetOutput(os.Stdout)
}

func main() {
    fmt.Println("login_server start listen.")

    http.HandleFunc("/msg_server", func(w http.ResponseWriter, r *http.Request) {
        fmt.Printf("http req,host:%s \n", r.Host)

        res := ServerInfo{
            Code:       0,
            Msg:        "",
            PriorIP:    "192.168.1.100",
            BackupIP:   "192.168.1.100",
            Port:       "9090",
            MsfsPrior:  "http://192.168.1.100:8700/",
            MsfsBackup: "http://192.168.1.100:8700/",
            Discovery:  "http://192.168.1.100/api/discovery",
        }
        buf, _ := json.Marshal(res)
        _, e := fmt.Fprint(w, string(buf))
        if e != nil {
            fmt.Printf("http response has error:%s \n", e.Error())
        }
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

在浏览器输入:localhost:8080/msg_server,应该就会出现结果哟。

TCP代码示例

Server

package main

import (
   "fmt"
   "net"
)

func main() {
   fmt.Println("server listen on 192.168.31.238:8090")

   ln, err := net.Listen("tcp", "192.168.31.238:8090")
   if err != nil {
      fmt.Printf("listen on 192.168.31.238:8090 failed:%s \n", err.Error())
   }
   for {
      con, _ := ln.Accept()
      go newConnect(con)
   }
   fmt.Println("exit!")
}

func newConnect(con net.Conn) {
   defer con.Close()

   fmt.Println("new connect comming,type:", con.RemoteAddr().Network(), ",endpoint:", con.RemoteAddr().String())
   var buf [10 * 1024]byte
   // 循环读取
   for {
      fmt.Println("ready read data...")
      // 没有数据时,会阻塞
      len, err := con.Read(buf[0:])
      if err != nil {
         fmt.Println("read filead:", err.Error())
         break
      }
      if len > 0 {
         fmt.Println("read data:", string(buf[0:len]), ",len:", len)
         con.Write([]byte("hello go_tcp_client"))
      }
   }

   fmt.Println(con.RemoteAddr().String(), " has disconnected")
}

Client

package main

import (
   "fmt"
   "net"
   "time"
)

func main() {
   fmt.Println("tcp server start listen.")

   con, err := net.Dial("tcp", "192.168.31.238:8090")
   if err != nil {
      fmt.Println("connect failed :", err.Error())
   }
   fmt.Println("connect success!")
   time.Sleep(2 * time.Second) // 休眠2秒,便于在server端观察

   len, err := con.Write([]byte("hello go_tcp_server first!"))
   if len <= 0 {
      fmt.Println("send data failed :", err.Error())
   }
   con.Write([]byte("hello go_tcp_server second!")) // 连续发2条 
   time.Sleep(5 * time.Second)

   con.Close() // 断开TCP连接,结束
}

写到这里,我们大概已经学会如何使用go编写简单的http server和tcp server啦。

但是,离真正的im server还有很远的距离,我们不妨研究下别人的开源im项目,看看别人是用的什么技术栈,然后我们再针对性的补充学习吧。

IM开源golang项目推荐:
1.GoBelieveIO(Golang)
强烈推荐奥,笔者很久之前就关注啦。
2.TeamTalk(C++)
如果有c++基础的,也可以研究这个项目哟。大部分功能都有了,可以直接部署。功能还有界面和qq比较像。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值