我正在尝试学习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方法,等待连接,连接成功会