Go中格式错误的HTTP状态代码“/”错误

时间:2013-05-31 00:38:00

标签: go

Server.go

package main

import (
    "fmt"
    "net/http"
    //"strings"
   "encoding/json"
   "io/ioutil"
   "strconv"
    "net"
    "bufio"
)

type Message struct {
    Text string
}

func Unmarshal(data []byte, v interface{}) error


func main() {

    //http.HandleFunc("/", handler)
    server,_ := net.Listen("tcp", ":" + strconv.Itoa(8080))
    if server == nil {
        panic("couldn't start listening: ")
    }
    conns := clientConns(server)
    for {
        go handleConn(<-conns)
    }

}


func clientConns(listener net.Listener) chan net.Conn {
    ch := make(chan net.Conn)
    i := 0
    go func() {
        for {
            client, _ := listener.Accept()
            if client == nil {
                fmt.Printf("couldn't accept: ")
                continue
            }
            i++
            fmt.Printf("%d: %v <-> %v\n", i, client.LocalAddr(), client.RemoteAddr())
            ch <- client
        }
    }()
    return ch
}


func handleConn(client net.Conn) {
    b := bufio.NewReader(client)
    fmt.Println("Buffer")
    for {
        line, err := b.ReadBytes('\n')
        if err != nil { // EOF, or worse
            break
        }
        client.Write(line)
    }
}

Client.go

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "strings"
    "flag"
    //"io"
   // "net"
  //  "net/rpc"
//    "sync"
)

func Unmarshal(data []byte, v interface{}) error

func Marshal(v interface{}) ([]byte, error)


type Message struct {
    Text string
}

func main(){
    var flagtext = flag.String("flagtext", "Hello!", "Flag")
    flag.Parse()
    var text string
    text = *flagtext
    m := Message{text}
    var m1 Message
    b, err := json.Marshal(m)
    if err == nil{
        resp, err := http.Post("http://127.0.0.1:8080","application/json", strings.NewReader(string(b)))
        if err != nil{
            log.Fatal("Error while post: %v",err)
        }
        fmt.Println(resp)

        err = json.Unmarshal(b, &m1)
    }
}

我运行client.go时遇到错误:

Error while post: %vmalformed HTTP status code "/"

但是,服务器为每个帖子注册一个频道,但它显示格式错误的HTTP状态代码。是因为我在错误的频道收听吗?我很困惑为什么会出现这个错误。

2 个答案:

答案 0 :(得分:4)

服务器代码中的这一行:

client.Write(line)

将请求行发送回客户端。由于客户端发布了GET / HTTP/1.1之类的内容,这意味着服务器正在使用GET / HTTP/1.1之类的内容进行响应,而不是HTTP/1.1 200 OK之类的内容。您看到的错误消息是因为/出现在状态代码位置。

答案 1 :(得分:2)

在server.go中,您似乎正在尝试从TCP套接字级别编写自己的HTTP服务器。这是不必要的工作 - 采用简单的路线并使用内置的HTTP服务器API。

这种服务器的概要如下:

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

并进一步描述in this article。更多文档位于net/http