参考的这位大佬的:https://blog.csdn.net/wowzai/article/details/9936659
但是这个实际上服务器不会echo回去。所以我写了个带echo回去的版本。
server
package main
import (
"net"
"os"
"fmt"
"io"
"bufio"
)
func handleConn(tcpConn *net.TCPConn) {
if tcpConn == nil {
return
}
inputReader := bufio.NewReader(tcpConn)for {
'\n')
input, err := inputReader.ReadString(if err == io.EOF {
"The RemoteAddr:%s is closed!\n", tcpConn.RemoteAddr().String())
fmt.Printf(return
}
handleError(err)if input == "exit" {
"The client: %s has exited\n", tcpConn.RemoteAddr().String())
fmt.Printf(
}"Read:%s", input)
fmt.Printf(byte(input))
tcpConn.Write([]
}
}func handleError(err error) {
if err == nil {
return
}"error:%s\n", err.Error());
fmt.Printf(// TODO: Make it more robust
1)
os.Exit(
}func main() {
if len(os.Args) != 2 {
"Usage: %s <port>", os.Args[0]);
fmt.Println(return
}1]
port := os.Args["tcp4", "localhost:" + port)
tcpAddr, err := net.ResolveTCPAddr(
handleError(err)"tcp4", tcpAddr)
tcpListener, err := net.ListenTCP(
handleError(err)defer tcpListener.Close()
for {
tcpConn, err := tcpListener.AcceptTCP()"The client:%s has connected!\n", tcpConn.RemoteAddr().String())
fmt.Printf(
handleError(err)defer tcpConn.Close()
go handleConn(tcpConn)
} }
client
package main
import (
"net"
"fmt"
"os"
"bufio"
)
func handleError(err error) {
if err == nil {
return
}"error:%s\n", err.Error());
fmt.Printf(// TODO: Make it more robust
1)
os.Exit(
}
func main() {
"tcp", "127.0.0.1:5188")
tcpAddr, _ := net.ResolveTCPAddr("tcp", nil, tcpAddr)
conn, err := net.DialTCP(if err != nil {
"server is not starting")
fmt.Println(return
}defer conn.Close()
for {
inputReader := bufio.NewReader(os.Stdin)'\n')
input, err := inputReader.ReadString(
handleError(err)"client send: ", input)
fmt.Print(byte(input)
b := []
conn.Write(b)
echoReader := bufio.NewReader(conn)'\n')
echo, err := echoReader.ReadString(
handleError(err)"Server echo: ", echo)
fmt.Print(
} }