Go语言网络编程
有关网络的基本知识我之前的博客介绍的很详细 这里就不再赘述了 这里主要讲解下Go语言网络编程的语法
Go语言程序
我们建立一个tcp链接的步骤为 socket bind listen accept 但是在Go语言中 我们并不需要前两步 并且listen 和 accept的结构都嵌入到了 net 网络包当中 所以说我们只需要调用net包即可
服务端
go
package main
import (
"fmt"
"net"
"strings"
)
func dealcoon(coon net.Conn) {
// 接收到链接之后我们开始接受数据
defer coon.Close() // 在这个函数结束的时候 我们关闭链接套接字
ipaddress := coon.RemoteAddr().String()
fmt.Println("新的链接已获得 ip地址为", ipaddress)
buf := make([]byte, 1024) // 开辟一个新的缓冲区来接受用户的数据
for { // 阻塞等待用户发送的数据
n, err := coon.Read(buf) // 从链接中读取数据 相当于像buf中写入数据 n为读取的长度
if err != nil {
fmt.Println("conn read error")
break
} // 读取失败 出现了某些问题
// 走到这里表示读取成功 读取了n个字节的数据 我们进行切片截取 只截取有效数据
result := buf[:n]
// 如果对方发送了exit 直接退出
if "exit" == string(result) {
println("收到退出信号 直接退出")
return
}
// 如果是其他的数据 我们将数据大写之后返回给客户端
coon.Write([]byte(strings.ToUpper(string(result))))
}
}
func main() {
// 首先创建一个监听套接字
listener, err := net.Listen("tcp", "127.0.0.1")
if err != nil {
println("listen error ")
return
}
defer listener.Close()
// 因为我们的tcp程序需要不断的accept新数据 所以说这里要使用一个for循环
for {
//
conn, err := listener.Accept()
if err != nil {
fmt.Println("accept error")
break
} // 跑到这里说明我们套接字的listen出现了错误
// 这里直接分出一个协程去处理其他问题
}
}
客户端
go
package main
import (
"fmt"
"log"
"net"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1")
if err != nil {
log.Fatal("conn error")
} // 链接失败
// 到这里就是链接成功了
for {
fmt.Println("请输入你要发送的数据")
buf := make([]byte, 1024)
fmt.Scan(&buf)
// 向服务器发送数据
conn.Write(buf)
// 接受服务器的数据并打印出来
n, err2 := conn.Read(buf)
if err2!= nil {
fmt.Println("出现读取错误了")
break
}
// 截取有效长度的字节
result := buf[:n]
fmt.Println(string(result))
}
}
Http程序
有关http协议我之前的博客介绍的很详细 大家如果想了解可以参考我的这几篇博客 Http协议详解
我们写Http服务端程序时 需要包含 net/http
包
之后的使用方法如下
- 首先我们需要注册带有
func(w http.ResponseWriter, r *http.Requests)签名的函数
- 其中 w 用来给客户端发送各种数据 r用来获取各个参数
- 之后我们选择使用
http.HandleFunc("/go", myHandler)
函数来注册各个url对应的处理函数 - 最后我们指定ip和端口进行监听即可 代码如下
http.ListenAndServe("127.0.0.1:8000", nil)
我们写Http客户端程序时 需要包含 net/http
包
这里的步骤就更简单了
- 直接使用
http.Get("http://127.0.0.1:8000/go")
函数 指定我们需要的url即可
之后就是对于数据业务的处理了 此处省略