简单的 Web 服务器实现:GoLang

Simple Web Server Implementation: GoLang

我正在尝试使用 Go 实现一个简单的 Web 服务器。我希望 "Hello World" 显示在客户端浏览器的 URL “http://127.0.0.1.12000/”。

我尝试了以下代码,但最终出现错误。

package main

import "net"
import "fmt"
import "bufio"

// import "strings"
// only needed below for sample processing

func main() {
    fmt.Println("Launching server...")

    // listen on all interfaces
    ln, err := net.Listen("tcp", ":12000")
    if err != nil {
        fmt.Println("Launching error1...")
        return
    }
    // run loop forever (or until ctrl-c)
    for {
        // accept connection on port
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Launching error2...")
            return
        }

        // will listen for message to process ending in newline (\n)
        message, err := bufio.NewReader(conn).ReadString('\n')

        if err != nil {
            fmt.Println("Launching error3...")
            newmessage := "Hello World!"
            conn.Write([]byte(newmessage + "\n"))
            return
        }

        // output message received
        fmt.Print("Message Received:", string(message))

        // sample process for string received
        newmessage := "Hello World!"
        conn.Write([]byte(newmessage + "\n"))
    }
}

当我尝试执行代码时,命令行显示如下,但在浏览器上没有输出..

Launching server...
Message Received:GET / HTTP/1.1
Message Received:GET / HTTP/1.1

我错过了什么吗?我有没有做错什么?

只是在这里添加一些信息.. 那不是您正在编写的简单服务器。您正在尝试编写没有 net/http 包的 HTTP 服务器。这很重要。也许你想要一个回声服务器?

您的浏览器需要格式正确的 HTTP 响应。这意味着您不能只向连接写入一个随机字符串并期望它知道如何处理它。这是 HTTP 协议描述的 wikipedia(我不打算在 SO 答案中描述整个协议)。

如果您只想要一个应该有效的简单答案:

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8;
Content-Length: LENGTH OF BODY HERE

BODY

注意header之间用\r\n隔开,最后一个header后面跟着两个:\r\n\r\n.

所以这个:

conn.Write([]byte("HTTP/1.1 200 OK\r\n"))
conn.Write([]byte("Content-Type: text/plain; charset=UTF-8\r\n"))
newmessage := "Hello World!"
conn.Write([]byte("Content-Length: " + strconv.Itoa(len(newmessage)) + "\r\n\r\n"))
conn.Write([]byte(newmessage + "\n"))

此外,我想因为这是一个协议问题,我还可以让您知道典型的 HTTP 端口是 80,而 alternative/testing 端口是 8080。我猜只是为了您的知识而添加的一些约定。