热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我用Golang写了一个端口转发工具,但是性能极其低下,求各位帮忙分析分析

源码在这里:h

源码在这里:



https://github.com/cw1997/net...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main



import (

    //"fmt"

    "net"

    //"os"

    //"bufio"

    "log"

    "io/ioutil"

)



const (

    ip   = ""

    port = 8899

)



func main() {

    listen, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(ip), port, ""})

    if err != nil {

        log.Println("监听端口失败:", err.Error())

        return

    }

    log.Println("已初始化连接,等待客户端连接...")

    Server(listen)

}



func Server(listen *net.TCPListener) {

    for {

        conn, err := listen.AcceptTCP()

        if err != nil {

            log.Println("接受客户端连接异常:", err.Error())

            continue

        }

        log.Println("客户端连接来自:", conn.RemoteAddr().String())

        defer conn.Close()

        go func() {

            data := make([]byte, 8192)

            for {

                i, err := conn.Read(data)

                //log.Println("客户端发来数据:\n", string(data[0:i]))

                // log.Println("客户端发来数据:\n", data)

                log.Println("客户端发来数据:", i)

                if err != nil {

                    log.Println("读取客户端数据错误:", err.Error())

                    break

                }

                go conn.Write(Send(data))

            }

        }()

    }

}



func Send(data []byte) (buf []byte) {

    pTCPConn, err := net.Dial("tcp", "127.0.0.1:80")

    if err != nil {

        //log.Fprintf(os.Stderr, "Error: %s", err.Error())

        log.Printf("Error: %s", err.Error())

        return

    }



    n, errWrite := pTCPConn.Write(data)

    if errWrite != nil {

        //log.Fprintf(os.Stderr, "Error: %s", errWrite.Error())

        log.Printf("Error: %s", errWrite.Error())

        return

    }

    defer pTCPConn.Close()



    //log.Fprintf(os.Stdout, "writed: %d\n", n)

    log.Printf("writed: %d\n", n)



    buf, errRead := ioutil.ReadAll(pTCPConn)

    //log.Println("服务端发来数据:\n", string(buf))

    log.Println("服务端发来数据:", len(buf))

    if errRead != nil {

        //log.Fprintf(os.Stderr, "Error: %s", errRead.Error())

        log.Printf("Error: %s", errRead.Error())

        return

    }

    //r := len(buf)

    //fmt.Fprintf(os.Stdout, string(buf[:r]))

    //fmt.Fprintf(os.Stdout, "readed: %v\n", buf)

    return

}

我用这个小工具代理一个开在内网的HTTP服务器,但是访问延时很大,一个很简单的phpinfo页面都要5s才能打开,其他页面资源比较多的网页那就更不用说了,卡的要命,求各位帮忙分析分析问题出在哪啊?(还有我是新手,很多内置库可能用法有误,还求各位轻喷并且帮忙指出来一下,谢谢各位老鸟帮忙)



另外我这个代码里面是写死了read buffer缓冲区为8192字节,如果遇到一个HTTP包尺寸很大该怎么处理呢?把这个[]byte的长度无限make大也不是办法啊


   



推荐阅读
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
沛妤林_654
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有