1. net
中文文档网址:https://studygolang.com/pkgdoc
- 客户端通过
func Dial(network, address string) (Conn, error)
连接到服务器 - 服务器通过
func Listen(net, laddr string) (Listener, error)
开启服务器端口,利用func (l *Listener) Accept() (Conn, error)
来获取客户端的连接 - 发送消息通过下面的
Write()
和Read()
方法
1.1 Conn的方法
type Conn interface {
// Read从连接中读取数据
// Read方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
Read(b []byte) (n int, err error)
// Write从连接中写入数据
// Write方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真
Write(b []byte) (n int, err error)
// Close方法关闭该连接
// 并会导致任何阻塞中的Read或Write方法不再阻塞并返回错误
Close() error
// 返回本地网络地址
LocalAddr() Addr
// 返回远端网络地址
RemoteAddr() Addr
// 设定该连接的读写deadline,等价于同时调用SetReadDeadline和SetWriteDeadline
// deadline是一个绝对时间,超过该时间后I/O操作就会直接因超时失败返回而不会阻塞
// deadline对之后的所有I/O操作都起效,而不仅仅是下一次的读或写操作
// 参数t为零值表示不设置期限
SetDeadline(t time.Time) error
// 设定该连接的读操作deadline,参数t为零值表示不设置期限
SetReadDeadline(t time.Time) error
// 设定该连接的写操作deadline,参数t为零值表示不设置期限
// 即使写入超时,返回值n也可能>0,说明成功写入了部分数据
SetWriteDeadline(t time.Time) error
}
1.2 Client代码
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
fmt.Println("正在连接到服务器...")
// 调用Dial函数去连接
conn, err := net.Dial("tcp", "127.0.0.1:4567")
if err != nil {
fmt.Println("Error connecting:", err.Error())
return
}
fmt.Println("连接服务器成功")
// 通过客户端的终端发送单行数据
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("请输入要发送的内容:")
// 读取一行输入
msg, _ := reader.ReadString('\n')
if msg == "exit\r\n" {
fmt.Println("退出连接")
conn.Close()
break
}
n, _ := conn.Write([]byte(msg))
fmt.Println("Sent", n, "bytes to server")
}
}
1.3 Server代码
package main
import (
"fmt"
"net"
)
func handleRequest(conn net.Conn) {
defer conn.Close()
for {
// 创建一个切片用于缓存数据
buf := make([]byte, 1024)
// 从 conn中读取数据
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
// 打印接收到的数据
fmt.Printf("Received data: %s\n", string(buf[:n]))
}
}
func main() {
fmt.Println("Connecting to client ...")
//Listen启动监听
listen, err := net.Listen("tcp", "127.0.0.1:4567")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
fmt.Println("Listening on 127.0.0.1:4567")
defer listen.Close()
// 监听之后 等待客户端连接
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
}
fmt.Printf("Client connected ..., con=%v, Client info = %v \n", conn, conn.RemoteAddr().String())
// go 启动一个协程处理客户端连接
go handleRequest(conn)
}
}