GoLang之网络
GoLang之网络
Go语言标准库里提供的net包,支持基于IP层、TCP/UDP层及更高层面(如HTTP、FTP、SMTP)的网络操作,其中用于IP层的称为Raw Socket。
net包的Dial()函数用于创建网络连接,函数原型如下:
func Dial(net, addr string) (Conn, error)
其中net参数是网络协议的名字,addr参数是IP地址或域名;如果连接成功,返回连接对象,否则返回error。
目前,Dial()函数支持如下几种网络协议:"tcp"、"udp"、"ip"、"ip6"等,例如:
conn, err := net.Dial("tcp", "192.168.0.10:2100") // TCP连接
conn, err := net.Dial("udp", "192.168.0.12:975") // UDP连接
conn, err := net.Dial("ip4:icmp", "www.baidu.com") // ICMP连接
在成功连接连接后,可以使用conn的Write()和Read()方法读写数据。
实际上,Dial()函数是对DialTCP()、DialUDP()、DialIP()、DialUnix()函数的封装:
func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err error)
func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err error)
func DialIP(netProto string, laddr, raddr *IPAddr) (c *IPConn, err error)
func DialUnix(net string, laddr, raddr *UnixAddr) (c *UnixConn, err error)
下面是一个TCP示例程序:
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
} func readFully(conn net.Conn) ([]byte, error) {
defer conn.Close() result := bytes.NewBuffer(nil)
var buf [512]byte
for {
n, err := conn.Read(buf[0:])
result.Write(buf[0:n])
if err != nil {
if err == io.EOF {
break
} return nil, err
}
} return result.Bytes(), nil
} func main() { addr := "127.0.0.1:80"
conn, err := net.Dial("tcp", addr)
checkError(err) _, err = conn.Write([]byte("GET /api/v3/get HTTP/1.1\r\n\r\n"))
checkError(err) result, err := readFully(conn)
checkError(err) fmt.Println(string(result)) os.Exit(0)
}
HTTP协议
Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。
HTTP客户端
net/http包的Client类型提供了如下几个方法:
func (c *Client) Get(url string) (r *Response, err error)
func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err error)
func (c *Client) PostForm(url string, data url.Values) (r *Response, err error)
func (c *Client) Head(url string) (r *Response, err error)
func (c *Client) Do(req *Request) (r *Response, err error)
以GET方法为例:
resp, err := http.Get("http://cre.mix.sina.com.cn/api/v3/get")
if err != nil {
fmt.Println("get failed", err)
return
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
上面这段代码请求一个网站首页,并将其内容打印到标准输出流中。
如果希望对请求做更多的控制,可以使用DO()方法:
req, err := http.NewRequest("GET", "http://cre.mix.sina.com.cn/api/v3/get", nil) req.Header.Add("User-Agent", "Go GO") client := &http.Client{} resp, err := client.Do(req)
HTTP服务端
使用net/http包提供的下面两个方法
func ListenAndServe(addr string, handler Handler) error
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error
ListenAndServe()函数有2个参数,第一个参数addr即监听地址,第二个参数表示服务端处理程序,通常为空,使用默认的http.DefaultServeMux进行处理。
服务端的业务逻辑使用http.Handle()或http.HandleFunc(),会默认注入http.DefaultServeMux中,如:
http.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}) http.ListenAndServe(":8001", nil)
RPC协议
在Go中,标准库提供的net/rpc包实现了PRC协议需要的相关细节,开发者可以很方便地使用该包编写RPC的服务端和客户端程序。
json处理
在Web开发领域中,JSON被广泛用于web服务端程序和客户端之间的数据通信。
Go语言内建对JSON的支持,使用encoding/json标准库,开发者可以轻松使用Go程序生成和解析JSON格式的数据。
func Marshal(v interface{}) ([]byte, error)
func Unmarshal(vdata []byte, v interface{}) error
JSON编码的一个例子:
type Book struct {
Title string
Authors [] string
Publisher string
IsPublished bool
Price float32
} func main() { gobook := Book {
"Go programming",
[]string { "XuShiwei", "HughLv", "Johnson"},
"isturing.com.cn",
true,
9.99,
} // encode
b, err := json.Marshal(gobook) // 变量b 是一个[]byte类型
if err == nil {
fmt.Println(b)
} // decode
var book Book
json.Unmarshal(b, &book)
fmt.Println(book)
}
当我们调用json.Marshal(gobook)函数时,会递归遍历gobook对象,如果发现gobook这个数据结构实现了json.Marshaler接口且包含有效的值,Marshal()就会调用其MarshalJSON()方法将该数据结构生成JSON格式的文本。
Go语言的大多数类型都可以转化为有效的JSON文本,但channel、complex和函数这几种类型除外;而对于指针,会转化为指针所指向的值,如果指针指向的是零值,那么null将作为转化后输出的结果。具体的转化规则如下:
- 布尔值转化为JSON的bool类型;
- 浮点数和整型转化为JSON的number类型;
- 字符串将以UTF-8编码转化为Unicode字符集的字符串;
- 数组和切片转化为JSON的array类型,但[]byte类型的值会被转化为Base64编码后的字符串,slice类型的零值会被转化为null;
- 结构体转化为JSON的object类型,并且只有结构体中以大写字母开头的可被导出的字段才会被转化输出;
- 转化一个map类型的数据结构时,该数据的类型必须是map[string] T。
GoLang之网络的更多相关文章
- golang gopacket网络抓包和分析
gopacket 是golang语言使用的网络数据抓取和分析的工具包. 本文简单介绍如何使用gopacket进行网络抓包. 下载gopacket # go get git@github.com:goo ...
- [golang note] 网络编程 - RPC编程
net包 • 官方文档 http://godoc.golangtc.com/pkg/net/ Package net provides a portable interface for network ...
- golang之网络开发
TCP Server/Client开发 net包提供network I/O开发接口,包括TCP/IP.UDP.DNS和Unix domain sockets. 常用开发一般仅需要最基础接口或函数: 服 ...
- Golang开发支持平滑升级(优雅重启)的HTTP服务
Golang开发支持平滑升级(优雅重启)的HTTP服务 - tabalt的博客 http://tabalt.net/blog/graceful-http-server-for-golang/ http ...
- 用Golang自己构造ICMP数据包
ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误. 限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的 ...
- Golang资料集
<Platform-native GUI library for Go> 介绍:跨平台的golang GUI库,支持Windows(xp以上),Unix,Mac OS X(Mac OS X ...
- Linux下Golang Socket编程原理分析与代码实现
在POSIX标准推出后,socket在各大主流OS平台上都得到了很好的支持.而Golang是自带Runtime的跨平台编程语言,Go中提供给开发者的Socket API是建立在操作系统原生Socket ...
- 一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket
既然是面向程序员的文章那当然不能只说说原理,一定要有实际动手的操作. 其实作为我个人的经历来说,对于网络编程,这是最重要的一章! 作为一位混迹业内近20年的快退休的程序员,我学习过很多的开发语言 ...
- go标准库I/O模型:epoll+多协程
本文为linux环境下的总结,其他操作系统本质差别不大.本地文件I/O和网络I/O逻辑类似. epoll+多线程的模型 epoll+多线程模型和epoll 单进程区别.优点 对比于redis这 ...
随机推荐
- 让Windows新建UTF-8编码的文本文件
一直以来都是使用[右键->新建->文本文件]的方法来新建一个代码文件,但是存在一个问题新建的文件是大小为0字节的.对于大小为0字节的文件文件,文本编辑器一般都使用MBCS编码,而MBCS编 ...
- Maven-搭建普通maven项目
点击Eclipse菜单栏File->New->Ohter->Maven得到如下图所示对话框: 选中Maven Project并点击Next,到下一个对话框(默认)继续点击Next得到 ...
- 【POJ 1698】Alice's Chance(二分图多重匹配)
http://poj.org/problem?id=1698 电影和日子匹配,电影可以匹配多个日子. 最多有maxw*7个日子. 二分图多重匹配完,检查一下是否每个电影都匹配了要求的日子那么多. #i ...
- ioc和aop的理解(Spring就是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。)
IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转.在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决.这个第三方指的就是Spring的容 ...
- bos启动56898服务器配置界面报错
//文件路径 /easweb/runtime/server/deploy/portal.ear/portal.war/WEB-INF/config/spring/applicationContext- ...
- RabbitMQ Exchange中的fanout类型
fanout 多播 在之前都是使用direct直连类型的交换机,通过routingkey来决定把消息推到哪个queue中. 而fanout则是把拿到消息推到与之绑定的所有queue中. 分析业务,怎样 ...
- 数据结构作业——brothers(二叉树)
brothers Description 给你一棵节点编号从 1 到 n 的,根节点为 1 的二叉树.然后有 q 个询问,每个询问给出一个整数表示树的节点,要求这个节点的兄弟节点数目和堂兄弟节点的数目 ...
- Code笔记之:CSS+HTML display 属性
display属性值:none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有换行符. inline-bl ...
- 异步-学习笔记3 Task
1. 通过Task启动多线程 2. 解决多线程的几大应用场景 private void btnTask_Click(object sender, EventArgs e) { Console.Writ ...
- Tomcat 的 ErrorPage 实现原理分析
使用Tomcat,一定见到过404,500的时候,见到过Tomcat提供的错误页面,例如请求的资源找不到的时候,响应状态码为404,这个时候的错误页面是这样的: 这些错误页面是 如何生成及定位展示的 ...