从回声服务器到网络框架(1)--Echo Server

如何写一个回声服务器

刚接触写服务器的时候,一般从一个简单的回声服务器开始,他实现的业务逻辑是,将客户端上传的数据,原封不动的回传给客户端。 虽然写一个Echo 服务器很简单,但是要写好也并不容易。因此只要初略看下服务实现的代码,基本上可以确定服务器的经验水平。不少 网络框架也会附带一个简单的Echo示例,来演示框架的使用,或者比较框架的性能。

利用Golang写一个Echo服务器是很简单的,下面是一个Server的代码:

func BeginListen(ls net.Listener) {
	for {
		conn, err := ls.Accept()
		if err != nil {
			fmt.Print(err)
			continue
		}
		go BeginHandle(conn)
	}
}

func BeginHandle(conn net.Conn) {
	for {
		temp := make([]byte, 1024)
		size, err := conn.Read(temp)
		if err != nil {
			panic(err)
		}
		fmt.Print("recv data: ", string(temp[0:size]))
		n, err := conn.Write(temp[0:size])
		if err != nil {
			panic(err)
		}
		if size != n {
			panic("write not equip")
		}
	}
}

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:1234")
	if err != nil {
		panic(err)
	}
	go BeginListen(listener)
	select {}
}

Client端的代码则更为简单:

func BeginHandle(client net.Conn) {
	index := 1
	for {
		_, err := client.Write([]byte(fmt.Sprintf("hello world %d\n", index)))
		index += 1
		if err != nil {
			panic(err)
		}
		temp := make([]byte, 1024)
		size, err := client.Read(temp)
		if err != nil {
			panic(err)
		}
		fmt.Print(string(temp[0:size]))
		time.Sleep(1 * time.Second)
	}
}

func main() {
	client, err := net.Dial("tcp", "127.0.0.1:1234")
	if err != nil {
		panic(err)
		return
	}
	BeginHandle(client)
}

值得考虑的问题

上面的例子,只是一个最基础的服务器Demo, 但是他至少正确的完成了Echo的逻辑。如果想要更进一步的写好这个服务器,你需要考虑和改进如下几点。

讨论请加 QQ group: 549675095


Powered by Jekyll and Theme by solid