简单的Web服务器实现:GoLang

时间:2015-10-23 01:07:21

标签: go webserver

我正在尝试使用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

我错过了什么吗?我犯了什么错误吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

BODY

请注意,标题由\r\n分隔,最后一个标题后跟两个:\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,替代/测试的是8080.我想,只是为你的知识增加了一些约定。