golang simple server with interactive prompt

独自空忆成欢 提交于 2020-05-17 07:09:05

问题


I am trying to build a simple CLI interface for my go process, I need to listen and serve on TCP port and get stats when connected to the port on TCP . I came across 'terminal' package to help with Password prompt, command history and other things. I tried to write up some code to achieve this. Although my client is not receiving any prompt or server is stuck on 'ReadLine' method. Any helpers?


package main

import (
    "bufio"
    "fmt"
    "golang.org/x/crypto/ssh/terminal"
    "io"
    "net"
    _ "time"
)

func handleConnection(conn net.Conn) error {
    fmt.Println("Handling new connection...")
    defer func() {
        fmt.Println("Closing connection...")
        conn.Close()
    }()
    r := bufio.NewReader(conn)
    w := bufio.NewWriter(conn)
    rw := bufio.NewReadWriter(r, w)
    term := terminal.NewTerminal(rw, "")
    term.SetPrompt(string(term.Escape.Red) + "> " + string(term.Escape.Reset))
    rePrefix := string(term.Escape.Cyan) + "Human says:" + string(term.Escape.Reset)
    line := "welcome"
    fmt.Fprintln(term, rePrefix, line)
    for {
        line, err := term.ReadLine()
        if err == io.EOF {
            return nil
        }
        if err != nil {
            return err
        }
        if line == "" {
            continue
        }
        fmt.Fprintln(term, rePrefix, line)
    }
}

func main() {
    // Start listening to port 8888 for TCP connection
    listener, err := net.Listen("tcp", ":8888")
    if err != nil {
        fmt.Println(err)
        return
    }

    defer func() {
        listener.Close()
        fmt.Println("Listener closed")
    }()

    for {
        // Get net.TCPConn object
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println(err)
            break
        }

        go handleConnection(conn)
    }
}

来源:https://stackoverflow.com/questions/61569297/golang-simple-server-with-interactive-prompt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!