前言
在网络编程中,关于Go语言中常用的包非net包莫属,下面,由笔者来一一的讲解一下Go语言net包中的常用函数,以及一些关于网络编程的步骤吧。
net包概述
net包主要用于网络编程,提供了创建网络连接、发送和接受数据、处理网络协议等功能。
主要类型和接口
Conn接口
Conn接口是net包的核心,代表了一个通用的网络连接
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
Close() error
LocalAddr() Addr
RemoteAddr() Addr
SetDeadline(t time.Time) error
SetReadDeadline(t time.Time) error
SetWriteDeadline(t time.Time) error
}
各参数意义:
Read(b []byte) (n int, err error)
:从连接中读取数据到b
中。Write(b []byte) (n int, err error)
:将b
中的数据写入连接。Close() error
:关闭连接。LocalAddr() Addr
:返回本地网络地址。RemoteAddr() Addr
:返回远程网络地址。SetDeadline(t time.Time) error
:设置连接的读写截止时间。SetReadDeadline(t time.Time) error
:设置读操作的截止时间。SetWriteDeadline(t time.Time) error
:设置写操作的截止时间。
Lintener接口
Listener接口用于监听和接受传入的连接
type Listener interface {
Accept() (Conn, error)
Close() error
Addr() Addr
}
各参数意义:
Accept() (Conn, error)
:等待并返回下一个连接。Close() error
:关闭监听器。Addr() Addr
:返回监听的网络地址
Addr接口
Adrr表示一个网络地址
type Addr interface {
Network() string // 返回网络类型(例如 "tcp", "udp")
String() string // 返回地址字符串(例如 "127.0.0.1:8080")
}
网络编程的基本步骤【插入补充】
1.创建套接字
使用编程语言提供的API(如GO语言中的net包)创建一个套接字。【套接字(socket)是一个抽象概念,表示网络通信的端点。套接字通常用于描述网络连接的两端,即客户端和服务器之间的通信通道。】
2.绑定地址和端口
将套接字绑定到一个特定的IP地址和端口上
3.监听连接(对于服务器)
服务器程序需要监听来自客户端的连接请求
4.接受连接(对于服务器)
服务器接受客户端的连接请求,并创建一个新的套接字来处理该连接
5.发送和接收数据
通过套接字发送和接收数据
6.关闭连接
通信结束后,关闭套接字以释放资源
举例:
TCP服务器
// 创建一个TCP监听器,监听本地8080端
listener,err := net.Listen("tcp","localhost:8080")
if err != nil {
fmt.Println("监听失败,",err)
return
}
defer listener.Close()
for {
conn,err :=listener.Accept()
if err != nil{
fmt.Println("error",err)
return
}
//处理连接
//一般使用并发,这样就不会轻易造成堵塞
buffer := make([]byte,1024)
//第一个参数返回的是成功读取的字节数
_,err := conn.Read(buffer)
if err != nil{
fmt.Println("Error",err)
}
fmt.Println("message :",string(buffer))
conn.Write([]byte("Message received."))
conn.Close()
}
TCP客户端
//创建一个TCP连接,连接到本地8080端口
conn,err :=net.Dial("tcp","localhost:8080")
if err != nil{
fmt.Println("conn error",err)
return
}
defer conn.Close()
message :="hello go net"
conn.Write([]byte(message))
buffer :=make([]byte,1024)
//第一个参数为成功读取的字节数
_,err =conn.Read(buffer)
if err != nil{
fmt.Println("Read error",err.Error())
return
}
// 打印服务器响应
fmt.Println("Server response:", string(buffer))
总结
Go语言中的net包没有直接使用socket套接字,因为Go语言的net
包抽象了底层的套接字操作,使得开发者可以更方便地进行网络编程。通过Conn接口、Listen和Dial函数来实现我们常常所需要的操作。
笔者接触的仅仅只有tcp类,关于其他的还暂未接触,故举例方面十分浅显,仅贴代码来方便理解。后续接触更多关于并发的项目再做补充。