参考一些资料,自己写了一个简单的echo。
简单功能:从客户端终端输入字符串(不超过1024),通过tcp发送给服务器端;服务器端收到什么字符串,就马上将字符串按照原路返回;客户端收到字符串后,马上显示出来。
server.go
package main
import (
"net"
"fmt"
"io"
)
const BUFF_SIZE = 1024
var buff = make([]byte,BUFF_SIZE)
// 接受一个TCPConn处理内容
func handleConn(tcpConn *net.TCPConn){
if tcpConn == nil {
return
}
for {
n,err := tcpConn.Read(buff)
if err == io.EOF {
fmt.Printf("The RemoteAddr:%s is closed!\n",tcpConn.RemoteAddr().String())
return
}
handleError(err)
if n > 0 {
fmt.Printf("Read:%s",string(buff[:n]))
}
tcpConn.Write(buff)
}
}
// 错误处理
func handleError(err error) {
if err == nil {
return
}
fmt.Printf("error:%s\n",err.Error())
}
func main() {
tcpAddr,err := net.ResolveTCPAddr("tcp","127.0.0.1:7000")
handleError(err)
tcpListener,err := net.ListenTCP("tcp",tcpAddr) //监听
handleError(err)
defer tcpListener.Close()
for {
tcpConn,err := tcpListener.AcceptTCP()
fmt.Printf("The client:%s has connected!\n",tcpConn.RemoteAddr().String())
handleError(err)
defer tcpConn.Close()
go handleConn(tcpConn) //起一个goroutine处理
}
}
client.go
package main
import (
"fmt"
"net"
"os"
"bufio"
)
const BUFF_SIZE = 1024
var buff = make([]byte, BUFF_SIZE)
func handleMessage(tcpConn *net.TCPConn, line string) {
//line += "\n"
content := []byte(line)
tcpConn.Write(content)
reader := bufio.NewReader(tcpConn)
message, err := reader.ReadString('\n')
if err != nil {
return
}
fmt.Println("recv message:",string(message))
}
func main() {
fmt.Println("begin dial...")
var tcpAddr *net.TCPAddr
tcpAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:7000")
tcpConn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
fmt.Println("dial error:", err)
return
}
defer tcpConn.Close()
fmt.Println("dial ok")
for {
r := bufio.NewReader(os.Stdin)
line, err := r.ReadString('\n')
if err == nil {
go handleMessage(tcpConn, line)
}
}
}
运行效果:
服务器端:
客户端:
参考:用golang编写简单的Echo Server(该文章中的echo服务器,只是将从客户端收到的字符串显示在终端中,并未将收到的字符串原路返回)
Golang实现简单tcp服务器02 – 实现echo服务器/客户端(该文章中,实现了收和发,但是并未从终端输入)
Go语言TCP Socket编程(内容较为详实,而且demo在github上,对学习go的网络编程帮助较大,代码点击此处)