go tcp服务器 客户端
来源:原创
时间:2019-03-15
作者:脚本小站
分类:GoLang
tcp_server.go
package main
import (
"fmt"
"net"
)
// 处理用户请求
func HandleConn(conn net.Conn) {
defer conn.Close()
addr := conn.RemoteAddr().String()
fmt.Println(addr, "connect sucessful")
buf := make([]byte, 2048)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("err = ", err)
return
}
fmt.Printf("[%s]: %s\n", addr, string(buf[:n]))
if string(buf[:n-2]) == "exit" {
fmt.Println(addr, "exit")
return
}
conn.Write([]byte("Send Successfuly\n"))
}
}
func main() {
listener, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("err = ", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("err = ", err)
return
}
go HandleConn(conn)
}
}tcp_client.go
package main
import (
"fmt"
"net"
"os"
)
func main() {
ch := make(chan int)
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("net.Dial err = ", err)
return
}
defer conn.Close()
// 接收键盘数据
go func() {
str := make([]byte, 1024)
for {
n, err := os.Stdin.Read(str)
if err != nil {
fmt.Println("os.Stdin.Read err = ", err)
return
}
if string(str[:n]) != "\r\n" {
conn.Write(str[:n])
}
if string(str[:n-2]) == "exit" {
ch <- 1
}
}
}()
// 接收服务器数据
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf) // Read会阻塞
if err != nil {
if <-ch == 1 { // 也会阻塞,只能将<-ch放到到这,要不然就执行不到Read了
return
} else {
fmt.Println("conn.Read err = ", err)
return
}
}
fmt.Println(string(buf[:n]))
}
}