一、网络编程基础
二、TCP Socket编程
(一)流程
首先应该了解服务端和客户端的处理流程:
1、服务端处理流程
- 监听端口
- 接收客户端tcp链接,建立双方的链接
- 创建goroutine,处理该链接的请求
2、客户端处理流程
- 建立与服务端的链接
- 与服务端进行通信
- 关闭链接
(二)代码实现
1、服务端(server.go)
package main
import (
"fmt"
"net"
)
func processReq(conn net.Conn) {
// 延时关闭conn
defer conn.Close()
// 与服务端进行通讯
for {
// 创建一个切片,盛放消息
buf := make([]byte, 1024)
// 1、等待客户端通过conn发送消息
// 2、如果没有消息,协程就阻塞在这里
m, err := conn.Read(buf)
if err != nil {
fmt.Println("客户端退出")
return
}
// 3、显示客户端发送的内容
fmt.Print(string(buf[:m]))
}
}
func main() {
fmt.Println("服务器开始监听,等待客户端的连接:")
ls, err := net.Listen("tcp", "0.0.0.0:9000")
if err != nil {
return
}
// 延时关闭listen
defer ls.Close()
// 等待客户端连接
for {
fmt.Println("等待客户端来连接:")
conn, err := ls.Accept()
if err != nil {
return
} else {
fmt.Printf("con=%v, 客户端ip=%v\n", conn, conn.RemoteAddr().String())
}
// 每一个客户端启动一个协程处理,防止过长时间相应
go processReq(conn) //conn接口类型,是引用
}
}
2、客户端(client.go)
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:9000")
if err != nil {
return
}
reader := bufio.NewReader(os.Stdin)
// 进行通讯
for {
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("客户端读取终端输入出错了...")
}
// 将line数据发送到服务器
_, err = conn.Write([]byte(line))
if err != nil {
fmt.Println("客户端发送数据出错了...")
}
}
}
Original: https://www.cnblogs.com/shenjianping/p/15937915.html
Author: iveBoy
Title: Go语言之网络编程
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535798/
转载文章受原作者版权保护。转载请注明原作者出处!