文章目录
1 TCP编程
1.1 C/S模型
// 查看本机所有端口信息
netstat -an
// 查看所有端口 pid
netstat -anb
C/S模型
Server
package main
import (
"fmt"
"io"
"net"
)
func doProcess(conn net.Conn) {
// 延时关闭连接
defer conn.Close()
for{
// 创建切片用于读取数据
buf := make([]byte, 1024)
// case1 阻塞在此处 等待读取数据
// case2 客户端关闭或者读取出错 err
//fmt.Printf("server wait client ip[%s] write something..\n", conn.RemoteAddr().String())
n, err := conn.Read(buf)
if err == io.EOF{
fmt.Printf("conn.Read close: %s\n", err)
break
}else if err != nil{
fmt.Printf("conn.Read err : %s\n", err)
break
}
// 显示实际读取的内容
fmt.Printf("read byte[%d] info[%s]\n", n, string(buf[:n]))
// 判断退出的程序
if n == 4 && "exit" == string(buf[:n]){
fmt.Printf("[Exit] gorutine\n")
break
}
}
}
func main() {
// [1] 监听端口
listen, err := net.Listen("tcp", "192.168.19.1:8888")
fmt.Println("[1] 监听端口 192.168.19.1:8888...")
if err != nil{
fmt.Printf("Listen err : %s\n", err)
return
}
// 延时关闭
defer listen.Close()
// listen type : *net.TCPListener val : &{0xc042090000}
fmt.Printf("listen type : %T val : %v\n", listen, listen)
// [2] 阻塞等待客户端连接
for{
fmt.Println("[2] 阻塞等待客户端连接 192.168.19.1:8888...")
conn, err := listen.Accept()
if err != nil{
fmt.Printf("Accept err : %s\n", err)
continue
}
// conn type : *net.TCPConn val : &{
{0xc04207a240}}
fmt.Printf("conn type : %T val : %v\n", conn, conn)
// conn client ip: 192.168.19.1:13749 server ip: 192.168.19.1:8888
fmt.Printf("conn client ip: %s server ip: %s\n", conn.RemoteAddr()