当前位置: 首页 > 面试题库 >

为什么将此简单的Web服务器称为偶数次?

陈哲
2023-03-14
问题内容

我正在尝试学习Go Web编程,这是一个简单的Web服务器:它可以打印出被调用的时间。

package main

import (
  "fmt"
  "net/http"
)

var calls int

// HelloWorld print the times being called.
func HelloWorld(w http.ResponseWriter, r *http.Request){
    calls++
    fmt.Fprintf(w, "You've called me %d times", calls)
}

func main() {
  fmt.Printf("Started server at http://localhost%v.\n", 5000)
  http.HandleFunc("/", HelloWorld)
  http.ListenAndServe(":5000", nil)
}

刷新页面时,我得到:

You've called me 1 times
You've called me 3 times
You've called me 5 times
....

问题:为什么是1、3、5倍而不是1,2,3 …?该函数HelloWorld的调用顺序是什么?


问题答案:

这是因为每个传入请求都被路由到您的HelloWorld()处理函数,并且浏览器在后台进行了多次调用,尤其是/favicon.ico

并且由于您的Web服务器没有发送回有效的网站图标,因此当您在浏览器中刷新页面时,它将再次请求它。

在Chrome上尝试:打开开发人员工具(CTRL+SHIFT+I),然后选择“网络”标签。点击刷新,您将看到2个新条目:

Name          Status   Type
--------------------------------------------------------
localhost     200      document
favicon.ico   200      text/plain

由于您的计数器以0(类型的默认值int)开头,因此您只需将其递增一次,然后发送回即可1。然后,请求favicon.ico再次将其递增(2),但不显示结果。然后,如果您刷新,它将再次增加到,3然后将其发送回,依此类推。

另请注意,多个goroutine可以同时处理请求,因此您的解决方案会遇到麻烦。您应该同步对calls变量的访问,或者使用sync/atomic软件包安全地增加计数器,例如:

var calls int64

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}

一个简单的“修复”来实现您想要的,将是检查请求路径,如果它不是root "/",请不要增加,例如:

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        return
    }
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}

您也可以选择仅排除对的请求favicon.ico,例如:

if r.URL.Path == "/favicon.ico" {
    return
}


 类似资料:
  • 操作系统: Windows 7 JDK: 1.8.0_05 我正在学习一些简单的RMI教程,包括Oracle的“计算”示例(Compute)。启动我的服务器不需要代码库,对类似问题的回答是“代码库是可选的”然而,我的服务器无法注册远程对象,除非它的接口位于某个代码库中。 我确保我的计算接口是可用的Web服务器上运行localhost,启动注册表服务器像这样: 一切正常: 但是如果我从Web服务器的

  • 主要内容:Web服务器的工作方式,搭建一个简单的 Web 服务器Go语言里面提供了一个完善的 net/http 包,通过 net/http 包我们可以很方便的搭建一个可以运行的 Web 服务器。同时使用 net/http 包能很简单地对 Web 的路由,静态文件,模版,cookie 等数据进行设置和操作。 Web服务器的工作方式 我们平时浏览网页的时候,会打开浏览器,然后输入网址后就可以显示出想要浏览的内容。这个看似简单的过程背后却隐藏了非常复杂的操作。 对于

  • 问题内容: 我编写了一些使用JSON编码的ASP.NET Web服务,例如: 返回的JSON是: 为什么将参数命名为?我可以控制吗?说,要? 问题答案: 这是一项“安全性”功能,可防止在Eval语句内的javascript中直接执行返回的JSON。或者类似的东西。 有关此主题的更多信息:http : //encosia.com/a-breaking-change-between-versions-

  • Http是一个比tcp更高级的协议,它描述了客户端浏览器如何与网页服务器进行通信。Go有自己的net/http包,我们来看看它。我们从一些简单的示例开始, 首先编写一个“Hello world!”:查看示例15.6 我们引入了http包并启动了网页服务器,和15.1的net.Listen("tcp", "localhost:50000")函数的tcp服务器是类似的,使用http.ListenAnd

  • 问题内容: 有谁知道将Java方法发布为Web服务的非常简单的方法?我真的不想要使用Tomcat或Jetty或任何其他容器框架的开销。 方案:我想从本地LAN上的其他计算机访问服务类型应用程序中的一组Java方法。 问题答案: 好吧,Tomcat或Jetty对于将某些方法发布为Web服务可能是过大的。但是另一方面,它并不太复杂,他们可以完成工作,那么为什么不呢? 不久前我遇到了类似的问题,并将To

  • 本文向大家介绍简单实现Java web服务器,包括了简单实现Java web服务器的使用技巧和注意事项,需要的朋友参考一下 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现; 一、程序执行步骤  1.创建一个ServerSocket对象;  2.调用ServerSocket对象的accept方法,等待连接,连接成功会