golang простой сервер с интерактивной подсказкой - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь создать простой интерфейс CLI для моего go процесса, мне нужно прослушивать и обслуживать порт TCP и получать статистику при подключении к порту по TCP. Я наткнулся на пакет 'терминал', чтобы помочь с подсказкой пароля, историей команд и другими вещами. Я попытался написать код для достижения этой цели. Хотя мой клиент не получает ни одного приглашения, или сервер застрял на методе ReadLine. Любые помощники?


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)
    }
}
...