帮忙看一下代码的执行乱序

ugenehan · 2017-10-25 02:51:03 · 2554 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-10-25 02:51:03 的主题,其中的信息可能已经有所发展或是发生改变。

输入内容,并将输入的内容传输至网络服务端。但是目前的代码,cmd.go中的Execmd函数,从打印的日志来看,dealConn函数输入内容后会执行2次。

main.go

package main

import (
    "fmt"
    "github.com/client/cmd"
    "net"
    "os"

    "github.com/spf13/cobra"
)
const version = "1.0.0"
var address string
var versionFlag bool
var conn net.Conn
var RootCmd = &cobra.Command{
    Use:  "client",
    RunE: execmd,
}

func execmd(c *cobra.Command, args []string) error {
    if versionFlag {
        fmt.Printf("client version %s\n", version)
        return nil
    }
    var err error
    conn, err = net.Dial("tcp", address)
    if err != nil {
        fmt.Println("error to connect, ", err)
        return err
    }
    fmt.Printf("connect to %s\n", address)

    return nil
}
func init() {
    RootCmd.Flags().BoolVarP(&versionFlag, "version", "v", false, "show version")
    RootCmd.Flags().StringVarP(&address, "addr", "d", "127.0.0.1:25610", "the host address,like 127.0.0.1:10000")
}

func main() {

    defer func() {
        conn.Close()
    }()

    if err := RootCmd.Execute(); err != nil {

        os.Exit(1)
    }

    go cmd.Execmd(conn)

    select {}
}

cmd.go

package cmd

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

func Execmd(conn net.Conn) (err error) {
    time.Sleep(3 * time.Second)
    var input string
    for {
        fmt.Printf("[%s]#", conn.RemoteAddr().String())
        fmt.Scanf("%s", &input)
        err = dealConn(conn,input)
        if err != nil {
            fmt.Printf("error to dealConn %s\n", err)
            return
        }
        fmt.Println("return from dealConn.")
    }

    return nil

}
func dealConn(conn net.Conn,input string) (err error) {
    fmt.Println("begin to exec cmd.")

    //发送命令
    conn.Write([]byte(input))
    conn.Write([]byte("\n"))

    //处理接受的结果
    reader := bufio.NewReader(conn)
    msg, err := reader.ReadString('\n')
    if err != nil {
        fmt.Println("response error\n")
        return err
    }
    fmt.Println("response:", string(msg))
    fmt.Println("exec cmd end.")
    return nil
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2554 次点击  
加入收藏 微博
2 回复  |  直到 2017-10-25 06:17:55
channel
channel · #1 · 7年之前

直接给你的输出结果,看看哪里出异常

ugenehan
ugenehan · #2 · 7年之前

已解决,是我用的日志库的问题。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传