jjzjj

Golang : Recursive function for reconnecting a TCP client. .. 坏主意?

coder 2024-07-12 原文

我有这个有效的 TCP 客户端代码。当它在 TCP 连接上写入或读取失败时,它会使用递归函数 tcpReconnect() 创建一个新连接。

这安全吗?它会填满 RAM 吗?它可能会在几天(周末或节假日)后尝试重新连接。此代码是监视工业机器状态的驱动程序的一部分。

也许这个问题有更好的解决方案。我找不到。

PS:我不喜欢投票

package main

import (
    "fmt"
    "net"
    "time"
)

var pollTime = 1000 //ms
var host = "127.0.0.1"
var port = "11000"

func main() {
    finished := make(chan bool)
    go Driver()
    <-finished
}

func tcpReconnect() net.Conn {
    newConn, err := net.Dial("tcp", host+":"+port)
    if err != nil {
        fmt.Println("Failed to reconnect:", err.Error())
        time.Sleep(time.Millisecond * time.Duration(2000))
        newConn = tcpReconnect()
    }
    return newConn
}

func Driver() {
    var conn net.Conn
    conn, err := net.Dial("tcp", host+":"+port)
    if err != nil {
        fmt.Println("Failed to initialize Connection, trying to reconnect:", err.Error())
        conn = tcpReconnect()
    }

    for {
        _, err = conn.Write([]byte("11|5546|STATUS" + "\r\n"))
        if err != nil {
            println("Write to server failed:", err.Error())
            println("Trying reset the connection...")
            conn = tcpReconnect()
        }

        var replyBuffer = make([]byte, 256)
        _, err = conn.Read(replyBuffer)
        if err != nil {
            println("Read from server failed:", err.Error())
            println("Trying reset the connection...")
            conn = tcpReConnect()
        }

        var reply string
        for i, val := range replyBuffer {
            if val == 13 { //13 is CR and marks the end of the message
                reply = string(replyBuffer[:i])
                break
            }
        }

        fmt.Printf("reply from server=%s\n", reply)
        time.Sleep(time.Millisecond * time.Duration(pollTime))
    }
}

最佳答案

这是我想出来的。学分转到@tkausl 和@ThunderCat

func Driver() {
    for {
        conn, err := net.Dial("tcp", host+":"+port)
        if err != nil {
            fmt.Println("Failed to connect:", err.Error())
            fmt.Println("Trying reset the connection...")
            time.Sleep(time.Millisecond * time.Duration(2000))
        } else {
            for {

                _, err = conn.Write([]byte("11|5546|STATUS" + "\r\n"))
                if err != nil {
                    fmt.Println("Write to server failed:", err.Error())
                    fmt.Println("Trying reset the connection...")
                    break
                }

                var replyBuffer = make([]byte, 256)
                _, err = conn.Read(replyBuffer)
                if err != nil {
                    fmt.Println("Read from server failed:", err.Error())
                    fmt.Println("Trying reset the connection...")
                    break
                }

                var reply string
                for i, val := range replyBuffer {
                    if val == 13 { //13 is CR and marks the end of the message
                        reply = string(replyBuffer[:i])
                        break
                    }
                }

                fmt.Printf("reply from server=_%s_\n", reply)
                time.Sleep(time.Millisecond * time.Duration(pollTime))
            }
        }
    }
}

关于Golang : Recursive function for reconnecting a TCP client. .. 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54797902/

有关Golang : Recursive function for reconnecting a TCP client. .. 坏主意?的更多相关文章

  1. 通过 MacPorts 的 RubyGems 是个好主意吗? - 2

    从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装ruby​​gems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf

  2. ruby - 使用 ruby​​ 进行套接字编程是个好主意吗? - 2

    我选择的语言是Ruby,但因为Twitter,我知道Ruby不能处理很多请求。将它用于套接字开发是个好主意吗?或者我应该像Twitter开发人员那样使用像erlang或haskell或scala这样的函数式语言吗? 最佳答案 我工作的公司使用Ruby作为我们的网站。到目前为止,我们已经处理了超过34,000,000,000次点击。我们每天处理大约10,000,000次点击没有问题。每天的点击量峰值已超过40,000,000次。可扩展性取决于很多因素。例如,与读取相比,我们的数据库执行的写入比例高得不成比例。虽然大多数网站执行大约90

  3. ruby-on-rails - 在 Rails 中动态重新加载路由是个坏主意吗? - 2

    我有一个正在编写的应用程序,我允许管理员为页面、类别等添加别名,我想根据别名使用不同的Controller/操作(不重定向,我'我发现render实际上并没有调用该方法。我只是渲染了模板)。我已经尝试了捕获所有路由,但我并不热衷于引发和捕获每次都会抛出的DoubleRender异常。我想出的解决方案是在服务器启动时动态生成路由,并在创建/更新/销毁别名时使用别名模型的回调重新加载路由。这是我的routes.rb中的代码:Alias.find(:all).eachdo|alias_to_add|map.connectalias_to_add.name,:controller=>alias

  4. ruby - sleep() 对于作业调度应用程序的主循环来说是个好主意吗 - 2

    我正在为我的工作用Ruby编写一个作业调度应用程序(主要是为了以给定的频率使用各种协议(protocol)移动文件)我的主循环是这样的:whiletruedo#somecodetolaunchtheproperjobsleepCONFIG["interval"]end它的工作就像一个魅力,但我不确定它是否足够安全,因为该应用程序可能在运行cpu密集型软件的服务器上运行。是否有另一种方法可以做同样的事情,或者sleep()对我来说是否足够安全? 最佳答案 每当我觉得需要阻塞时,我都会使用事件循环;通常是libev。这是一个Ruby绑定

  5. ruby - 从 'next' 返回值是个坏主意吗? - 2

    应该很简单。我想,从阅读thisblogpost我可以在我的next命令之后立即返回一些东西:如果axis_range=="test",下一个“新值”我真正想做的是在同一行记录下一个原因:next@logger.info('跳过这个项目是为了好玩')unless(elephants.size>0)我在rubydoc上找不到任何关于next用法的讨论。.该代码肯定有效。我意识到我可以用unlessblock来做到这一点,但是那行代码太简洁了。两个问题:有更好的文档吗?next的这种用法是不是有点奇怪而不是“ruby-ish”? 最佳答案

  6. ruby - 在系统范围内安装 RVM 是个坏主意吗? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion我很困惑,在服务器上,您应该以普通用户身份安装RVM还是进行系统范围的安装,如果是后者,您应该如何做bundleinstall不使用sudo。就RVM而言,在运行Rails的服务器上是否有明确的指导方针?乘客和Nginx?在这种类型的环境中,并非所有Ruby进程都在同一用户下运行,所以我认为就RVM和bundler而言,事情变得不清楚。在服务器上完全避免使用RVM并以传统方式安装Ruby和

  7. ruby-on-rails - 清除旧的 Rails 迁移文件是个好主意吗? - 2

    我已经运行一个大型Rails应用程序2年多了,一天天过去,我的ActiveRecord迁移文件夹已经增长到超过150个文件。有一些非常旧的模型,在应用程序中不再可用,但仍会在迁移中引用。我想删除它们。你怎么看?您通常会从代码库中清除旧的迁移吗? 最佳答案 TheRails4Way第177页:塞巴斯蒂安说……Alittle-knownfactisthatyoucanremoveoldmigrationfiles(whilestillkeepingnewerones)tokeepthedb/migratefoldertoamanagea

  8. ruby-on-rails - 将模型划分到目录中是个坏主意吗? - 2

    我的Rails应用程序中有100多个模型,只是为了组织,我将它们分成文件夹,所有这些仍然在主模型文件夹下,只是为了更容易在项目中导航和查看文件相关。这是个坏主意吗?rails的方法是什么? 最佳答案 不,这不是个坏主意。很多人都这样做,在大型应用程序中我离不开它。有两种方法:首先是移动模型。但是,您必须告诉Rails加载任意模型(因为它不知道它们在哪里)。像这样的东西应该可以解决问题:#Inconfig/application.rbmoduleYourAppclassApplication第一种方法很简单,但并不是最好的方法。第二种

  9. ruby - 为什么在 ruby​​ 中动态创建大量符号不是一个好主意(对于 2.2 之前的版本)? - 2

    ruby中symbol的作用是什么?字符串和符号有什么区别?为什么动态创建大量符号不是一个好主意? 最佳答案 符号就像字符串,但它们是不可变的-它们不能被修改。它们只被放入内存一次,这使得它们非常有效地用于哈希中的键之类的东西,但它们会保留在内存中直到程序退出。如果您滥用它们,这会使它们成为内存消耗者。如果您动态创建大量符号,您将分配大量内存,这些内存在程序结束前无法释放。如果您知道您将只动态创建符号(使用string.to_sym):需要反复访问符号不需要修改它们正如我之前所说,它们对于哈希之类的东西很有用-在这种情况下,您更关心

  10. javascript - 在远程加载的 javascript 中使用 document.write 写出内容——为什么是个坏主意? - 2

    我不是全职Javascript开发人员。我们有一个网络应用程序,其中一部分是将一个小的信息小部件写入另一个域。这实际上只是一个html表,其中写入了一些值。在过去的8年里,我不得不这样做几次,最后我总是通过一个脚本来完成它,而document.write不在表格中。例如:document.write('hereissomecontent');在theirdomain.com上.........我一直认为这有点丑陋,但效果很好,而且我们始终可以控制内容(或者受信任的代表可以控制您当前的库存等)。所以出现了另一个这样的项目,我使用document.write在大约5分钟内完成了编码。其他人

随机推荐