【原创】go语言学习(二十二)网络编程
目录
- TCP/IP协议介绍
- GO快速实现TCP服务端
- GO快速实现TCP客户端
- UDP协议介绍
- UDP编程实例
TCP/IP协议介绍
1、互联网起源
A. 起源于美国五角大楼,它的前身是美国国防部高级研究计划局主持研制的ARPAnet。
B. 互联网的基础是TCP/IP协议
C. TCP/IP 是供已连接因特网的计算机进行通信的通信协议。
2、TCP/IP协议
A. TCP (传输控制协议) - 应用程序之间通信。
B. UDP (用户数据包协议) - 应用程序之间的简单通信
C. IP (网际协议) - 计算机之间的通信。
D. DHCP (动态主机配置协议) - 针对动态寻址。
3、TCP协议
A. 面向连接的协议
B. 可靠传输,发送的数据保证对方能够收到。
C. 保证时序,发送的数据按发送的顺序到达。
D. 全双工的。
4、IP协议
A. 用于计算机之间进行通信,是TCP/UDP协议的底层
B. IP是无连接的,负责把数据包路由到目的地。
5、 TCP/IP协议图解

6、 TCP协议基础
A. 通过IP和端口进行计算机之间进行访问
B. 域名和知名端口,http:80,https:443,ssl:22端口等
7、Tcp服务端编程模型

GO快速实现TCP服务端
1、服务端处理流程

package main
import (
"fmt"
"net"
)
func main(){
listen, err := net.Listen("tcp", "0.0.0.0:20000")
if err != nil {
fmt.Println("listen failed, err:", err)
}
for {
conn, err := listen.Accept()
if err !=nil {
fmt.Printf("accept failed, err:%v\n", err)
continue
}
go process(conn)
}
}
func process(conn net.Conn){
defer conn.Close()
for {
var buf [128]byte
n, err := conn.Read(buf[:])
if err != nil {
fmt.Printf("read form conn failed, err:%v", err)
break;
}
str := string(buf[:n])
fmt.Printf("recv from client, data:%v\n", str)
}
}
GO快速实现TCP客户端
1、客户端编程模式

package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main(){
conn, err := net.Dial("tcp", "0.0.0.0:20000")
if err != nil {
fmt.Printf("dial failed, err:%v\n", err)
return
}
reader := bufio.NewReader(os.Stdin)
for {
data,err := reader.ReadString('\n')
if err != nil {
fmt.Printf("read from console failed, err:%v\n", err)
}
data = strings.TrimSpace(data)
_, err =conn.Write([]byte(data))
if err != nil {
fmt.Printf("write failed, err%v\n", err)
}
}
}
2、发送HTTP请求
A. HTTP协议是基于TCP协议之上的文本协议。
B. 每行文本使用\r\n结尾,当连续两个\r\n时,表示整个数据包结束。
package main
import (
"fmt"
"io"
"net"
)
func main(){
conn, err := net.Dial("tcp", "www.baidu.com:80")
if err != nil {
fmt.Printf("dial failed, err:%v\n", err)
return
}
data := "GET / HTTP/1.1\r\n"
data += "HOST: www.baidu.com\r\n"
data += "connection:close\r\n"
data += "\r\n\r\n"
_, err = io.WriteString(conn, data)
if err != nil {
fmt.Printf("wirte string failed, err:%v\n", err)
return
}
var buf [1024]byte
for {
n, err := conn.Read(buf[:])
if err != nil || n == 0 {
break
}
fmt.Println(string(buf[:n]))
}
}
UDP协议介绍
1、UDP协议
A. 用户数据库报协议
B. 无连接,直接进行数据发送
C. 不可靠、没有时序
D. 实时性比较好,通常用于视频直播相关领域。
UDP编程实例
1、服务端代码
package main
import (
"fmt"
"net"
)
func main() {
// 创建监听
socket, err := net.ListenUDP("udp4", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
})
if err != nil {
fmt.Println("监听失败!", err)
return
}
defer socket.Close()
for {
// 读取数据
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("读取数据失败!", err)
continue
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n\n", data)
// 发送数据
senddata := []byte("hello client!")
_, err = socket.WriteToUDP(senddata, remoteAddr)
if err != nil {
return
fmt.Println("发送数据失败!", err)
}
}
}
2、客户端代码
package main
import (
"fmt"
"net"
)
func main(){
// 创建连接
socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
IP: net.IPv4(127,0,0,1),
Port: 8080,
})
if err !=nil {
fmt.Println("连接失败!", err)
return
}
defer socket.Close()
// 发送数据
senddata := []byte("hello server!")
_, err = socket.Write(senddata)
if err != nil{
fmt.Println("发送数据失败!", err)
return
}
//接收数据
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("读取数据失败!", err)
return
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n", data)
}

浙公网安备 33010602011771号