GO программирование, блокировка функции чтения события читателя - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в программировании на Go, и меня смущает проблема с читателями bufio.Я программирую своего рода чат-клиент, который должен отображать и отправлять наши сообщения в режиме реального времени.Но сообщения, которые я получаю, не отображаются, пока я не нажму кнопку ввода в моем терминале.После нескольких тестов, похоже, что моя функция «inputListener ()» является проблемой, потому что, если я поставлю ее после чтения сообщений с сервера, сначала будут отображаться сообщения с сервера.Я предположил, что функция чтения может блокировать мой цикл, пока не получит '\ n' или что-то в этом роде.

Вот мой код:

package main
import "os"
import "strconv"
import "net"
import "bufio"

/*Recovery our input message into a buffer*/
func inputListener()([] byte){
    buf := make([]byte, 512)
    readerInput := bufio.NewReader(os.Stdin)
    _, err := readerInput.Read(buf)
    if err != nil{
        panic("Error reading input.")
        os.Exit(0)
    }
    return buf
}


func main(){
if len(os.Args) != 3{
    println("Usage: ",os.Args[0], " <host> <port>\n")
    os.Exit(0)
}

//Recovery the port.
port, err := strconv.Atoi(os.Args[2])
if err != nil{
  panic("Error during the port recovery\n")
  os.Exit(0)
}
println(port)

/*Join the adresse*/
addr := os.Args[1] + ":" + strconv.Itoa(port)
println(addr)

/*  sources -- https://golang.org/pkg/net/  */

conn, err := net.Dial("tcp", addr)
if err != nil{
    panic("Error connecting " + addr)
    os.Exit(0)
}


buf := make([]byte, 512)
t := make([]byte, 512)

for {

    /*Receive data from server*/
    size, err := conn.Read(buf)
    if err != nil {
        panic("Error reading output.")
        os.Exit(0)
    }
    if size >= 0{
        print(string(buf[0:size]))
    }

    /*Data we need to send*/
    t = inputListener()
    if len(t) >= 0{
        conn.Write(t)
    }
} 

conn.Close()
}

Мне нужно нажимать клавишу Enter для каждого сообщенияполучено: /

Заранее благодарю за ответы!

1 Ответ

0 голосов
/ 22 февраля 2019

Вы попробуйте что-то вроде этого:

package main

import (
    "bufio"
    "io"
    "net"
    "os"
    "strconv"
)

/*Recovery our input message into a buffer*/
func inputListener() []byte {
    buf := make([]byte, 512)
    readerInput := bufio.NewReader(os.Stdin)
    _, err := readerInput.Read(buf)
    if err != nil {
        panic("Error reading input.")
    }
    return buf
}

func main() {
    if len(os.Args) != 3 {
        println("Usage: ", os.Args[0], " <host> <port>\n")
        os.Exit(0)
    }

    //Recovery the port.
    port, err := strconv.Atoi(os.Args[2])
    if err != nil {
        panic("Error during the port recovery\n")
    }
    println(port)

    /*Join the adresse*/
    addr := os.Args[1] + ":" + strconv.Itoa(port)
    println(addr)

    /*  sources -- https://golang.org/pkg/net/  */

    conn, err := net.Dial("tcp", addr)
    if err != nil {
        panic("Error connecting " + addr)
    }
    defer conn.Close()

    go io.Copy(os.Stdout, conn)

    r := bufio.NewReader(os.Stdin)
    for {
        p, err := r.ReadSlice('\n')
        if err != nil {
            panic("Error reading output.")
        }
        conn.Write(p)
    }
}
...