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比较像。