【发布时间】:2013-11-08 00:25:15
【问题描述】:
我正在做的是相当直截了当的。我需要创建一个非常小且快速的“代理”服务器。目前我有一个代理到(nodejs)的基线服务器和一个代理服务(go)。请原谅缺乏实际的“代理” - 现在只是测试。
基线服务
var http = require('http');
http.createServer(function (req, res) {
// console.log("received request");
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');
代理服务
package main
import (
"flag"
"log"
"net/http"
"net/url"
)
var (
listen = flag.String("listen", "0.0.0.0:9000", "listen on address")
logp = flag.Bool("log", false, "enable logging")
)
func main() {
flag.Parse()
proxyHandler := http.HandlerFunc(proxyHandlerFunc)
log.Fatal(http.ListenAndServe(*listen, proxyHandler))
log.Println("Started router-server on 0.0.0.0:9000")
}
func proxyHandlerFunc(w http.ResponseWriter, r *http.Request) {
// Log if requested
if *logp {
log.Println(r.URL)
}
/*
* Tweak the request as appropriate:
* - RequestURI may not be sent to client
* - Set new URL
*/
r.RequestURI = ""
u, err := url.Parse("http://localhost:8080/")
if err != nil {
log.Fatal(err)
}
r.URL = u
// And proxy
// resp, err := client.Do(r)
c := make(chan *http.Response)
go doRequest(c)
resp := <-c
if resp != nil {
err := resp.Write(w)
if err != nil {
log.Println("Error writing response")
} else {
resp.Body.Close()
}
}
}
func doRequest(c chan *http.Response) {
// new client for every request.
client := &http.Client{}
resp, err := client.Get("http://127.0.0.1:8080/test")
if err != nil {
log.Println(err)
c <- nil
} else {
c <- resp
}
}
我的问题,正如标题中提到的那样,是我从 doRequest 函数中收到错误声明 2013/10/28 21:22:30 Get http://127.0.0.1:8080/test: dial tcp 127.0.0.1:8080: can't assign requested address,我不知道为什么。谷歌搜索这个特定错误会产生看似无关的结果。
【问题讨论】:
-
出于好奇,您在这里使用的端口
8080和9000有什么区别? -
主服务运行在端口
8080,代理服务运行在端口9000,并且会透明地调用8080上的服务(或者这就是它最终的工作方式)。 -
您忽略了来自
resp.Write调用在proxyHandlerFunc中的错误返回:这可以为您的问题提供线索吗?该错误听起来类似于groups.google.com/d/topic/golang-nuts/K0iAoVhAouE/discussion,但我原以为resp.Write()应该在成功完成后关闭正文。也许手动关闭身体可能会有所帮助。 -
我会添加一个检查,看看是否能解决任何问题,但是在挖掘文档和源代码后,连接并没有在写入时关闭。
-
添加了检查,写操作没有返回错误。