2013-05-31 37 views
1

Server.go畸形HTTP狀態代碼 「/」 錯誤轉到

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狀態碼。是因爲我在錯誤的頻道里聽嗎?我很困惑爲什麼會出現這個錯誤。

回答

3

這條線在服務器代碼:

client.Write(line) 

發送請求線返回給客戶端。由於客戶發佈類似GET/HTTP/1.1,這意味着服務器正在響應像GET/HTTP/1.1,而不是像HTTP/1.1 200 OK之類的東西。您看到的錯誤訊息是因爲/出現在狀態碼位置。

+0

如何更改服務器響應? – Hick

+0

'client.Write(line)'行是服務器響應客戶端的地方。 'line'是迴應。你可以用''HTTP/1.1 200 OK''替換'line'(來自請求)來改變它。 – ruakh

1

在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