2

服务器.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)
    }
}

客户端.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 状态代码。是不是因为我听错频道了?我很困惑为什么会发生这个错误。

4

2 回答 2

4

服务器代码中的这一行:

client.Write(line)

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

于 2013-05-31T01:01:53.210 回答
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)
}

在本文中进一步描述。更多文档在net/http中。

于 2013-06-01T10:44:27.300 回答