這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport ("bytes""flag""fmt""io""log""net""os""strings""time")func main() {var srcHost, agencyHost stringflag.StringVar(&srcHost, "srcHost", "", "srcHost")flag.StringVar(&agencyHost, "agencyHost", "", "agencyHost")flag.Parse()if srcHost == "" || agencyHost == "" {fmt.Fprintf(os.Stderr, "Fatal error: %s", "參數為空白")os.Exit(1)}//建立socket,監聽連接埠netListen, err := net.Listen("tcp", srcHost)CheckError(err)defer netListen.Close()Log("Waiting for clients")for {conn, err := netListen.Accept()//如果沒有請求就一直等待if err != nil {continue}if conn != nil {Log(conn.RemoteAddr().String(), " tcp connect success")go handleConnection(conn, agencyHost) //go 可以實現非同步並發請求}}}//處理串連func handleConnection(conn net.Conn, agencyHost string) {time.Sleep(10 * time.Millisecond)buffer := ReceiveData(conn)if len(buffer) > 1 {arr := strings.Split(string(buffer), "\r\n")if len(arr) > 1 {arr[1] = "Host: " + agencyHostnewstr := strings.Join(arr, "\r\n")SendAgencyHost([]byte(newstr), agencyHost, conn)}}conn.Close()}func SendAgencyHost(data []byte, host string, baseconn net.Conn) {conn, _ := net.Dial("tcp", host)conn.Write(data)time.Sleep(10 * time.Millisecond)bufferHead := ReceiveData(conn)time.Sleep(10 * time.Millisecond)bufferBody := ReceiveData(conn)var buf bytes.Bufferbuf.Write(bufferHead)buf.Write(bufferBody)baseconn.Write(buf.Bytes())conn.Close()}//接收資料統一方法func ReceiveData(conn net.Conn) []byte {var buf bytes.Bufferbuffer := make([]byte, 8192)for {sizenew, err := conn.Read(buffer)buf.Write(buffer[:sizenew])if err == io.EOF || sizenew < 8192 {break}}return buf.Bytes()}//列印資訊統一方法func Log(v ...interface{}) {log.Println(v...)}//執行錯誤處理方法func CheckError(err error) {if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}}