一个应用不会只做一件事情,或只完成一个任务。通常是既要显示WEB页面,也要做长链接,可能你还同时需要给手机端提供数据服务。
那么,我需要在一个应用服务端,实现同时为多个请求的业务服务。这些服务通常是不在一个端口实现的。
利用go语言的端口监听和协程,实现一下这个。
建立一个项目,假设我们需要访问的端口有两个:25000,25001。我在main中先写一个数组,承载这两个端口。当然,你可以写更多的需要监听的端口进去。
ports := []string{":25000",":25001"}
然后,需要对这些个端口都进行监听。这就需要遍历了。使用for循环吧。
for _,v := range ports {
go func(port string) {
//把端口都放入goroutine监听
mux := http.NewServeMux()
switch port {
case ":25000":
{
mux.HandleFunc("/", handler1)
}
case ":25001":
{
mux.HandleFunc("/", handler2)
}
}
http.ListenAndServe(port, mux)
}(v)
}
在这个循环里,使用一个switch来检查判断,当前的端口号是多少,然后不同的端口号去执行不同的函数 handler1和handler2。
这两个需要执行的函数就简单一点吧。说明问题就行。
func handler2(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "你想做什么就做什么吧!")
}
func handler1(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "Hello,Moon!")
}
一个打印出中文,一个打印出英文。(问候我最最喜欢的🌙)
现在是无法正常运行的,因为for循环执行完成后,程序就会自动关闭退出了。所以在后面再加一个空的select,让它可以一直运行下去。
select {
}
现在就可以运行了
两个端口的反馈,是不同的。
端口25001
端口25000
看一下完整代码
package main
import (
"fmt"
"net/http"
)
func main() {
ports := []string{":25000",":25001"}
for _,v := range ports {
go func(port string) {
//把端口都放入goroutine监听
mux := http.NewServeMux()
switch port {
case ":25000":
{
mux.HandleFunc("/", handler1)
}
case ":25001":
{
mux.HandleFunc("/", handler2)
}
}
http.ListenAndServe(port, mux)
}(v)
}
select {
}
}
func handler2(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "你想做什么就做什么吧!")
}
func handler1(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "Hello,Moon!")
}
网友评论