tcp简单通信

初始代码没有加注释,初始代码只能跑一次。往下拉就会有代码注释 慢慢看哈。本文提供的源码都可以直接执行

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)
}

3 初始执行结果

【GO】简单通信之TCP_数据

4. 多客户端对一个服务端

服务端

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("客户端以下线")

}