初始代码没有加注释,初始代码只能跑一次。往下拉就会有代码注释 慢慢看哈。本文提供的源码都可以直接执行
1 tcp初始服务端代码
package main import ( "fmt" "net" "os" ) func TcpError(err error, when string) { if err != nil { fmt.Println("错误地址,err", when, err) // 非正常退出,正常退出为0 os.Exit(0) } } func ioWithConn(conn net.Conn) { buffer := make([]byte, 1024) n, err := conn.Read(buffer) TcpError(err, "conn.Read") clientMsg := string(buffer[:n]) fmt.Println("收到客户端消息", clientMsg) conn.Write([]byte("msg receive" + clientMsg)) } func main() { // 监听tcp连接 listener, err := net.Listen("tcp", "127.0.0.1:8080") TcpError(err, "net.Listen") conn, err := listener.Accept() TcpError(err, "listener.Accept") ioWithConn(conn) }
2 tcp初始客户端代码
package main import ( "bufio" "fmt" "net" "os" ) func tcpError(err error, when string) { if err != nil { fmt.Println("错误地址,err", when, err) // 非正常退出,正常退出为0 os.Exit(0) } } func main() { // 直接拨号连接 conn, err := net.Dial("tcp", "127.0.0.1:8080") tcpError(err, "net.Dial") reader := bufio.NewReader(os.Stdin) lineBytes, _, _ := reader.ReadLine() conn.Write(lineBytes) buffer := make([]byte, 1024) n, _ := conn.Read(buffer) serverMsg := string(buffer[:n]) fmt.Println("server", serverMsg) }
package main import ( "fmt" "net" "os" ) func TcpError(err error, when string) { if err != nil { fmt.Println("错误地址,err", when, err) // 非正常退出,正常退出为0 os.Exit(0) } } func ioWithConn(conn net.Conn) { // 开辟一个缓冲区 buffer := make([]byte, 1024) // 关闭连接 defer conn.Close() for { // 读取数据 n, err := conn.Read(buffer) // 验证 TcpError(err, "conn.Read") // 把读取的数据放到缓存区中 clientMsg := string(buffer[:n]) fmt.Println("收到客户端消息", clientMsg) // 如果客户端输入的是 im off if clientMsg == "im off" { // 服务端往连接写一个bye conn.Write([]byte("bye")) break } // 服务端回复客户端的信息 conn.Write([]byte("msg receive" + clientMsg)) } fmt.Println("用户断开连接") } func main() { // 监听tcp连接 listener, err := net.Listen("tcp", "127.0.0.1:8080") // 验证错误 TcpError(err, "net.Listen") // 服务端一连接就会出现listener... fmt.Println("listener...") for { // 新的客户端连接 conn, err := listener.Accept() // 验证连接 TcpError(err, "listener.Accept") // 处理每一个客户端 go ioWithConn(conn) } }
客户端
package main import ( "bufio" "fmt" "net" "os" ) func tcpError(err error, when string) { if err != nil { fmt.Println("错误地址,err", when, err) // 非正常退出,正常退出为0 os.Exit(0) } } func main() { // 直接拨号连接 conn, err := net.Dial("tcp", "127.0.0.1:8080") tcpError(err, "net.Dial") // 读取键盘输入 reader := bufio.NewReader(os.Stdin) // 创建缓冲区 buffer := make([]byte, 1024) for { // 每次读取一行 lineBytes, _, _ := reader.ReadLine() // 输入写入字符串 conn.Write(lineBytes) // 读取缓冲区的数据(这块是服务端写的,这里就可以直接拿出来) n, _ := conn.Read(buffer) // 把字节转为字符串 serverMsg := string(buffer[:n]) fmt.Println("server", serverMsg) if serverMsg == "bye" { break } } fmt.Println("客户端以下线") }