J'ai donc démarré un projet qui implique des modules qui envoient et reçoivent des messages d'un serveur via des websockets. Cependant, je voulais un moyen simple d'interagir et d'envoyer des messages aux modules.Simple Message Client golang
Donc, j'ai le programme demander mon message dans un goroutine, quand j'appuie sur entrer, il envoie le message et m'invite à un autre. Dans le goroutine principal, il attendra jusqu'à ce qu'il reçoive un message et, le cas échéant, écrira sur la ligne en cours et remplacera ce qui était sur la ligne avant sur une nouvelle ligne.
Cependant, il n'y a qu'un seul problème. Il ne sait pas comment garder mes entrées à placer sur la nouvelle ligne. Dans mon test avec l'exemple suivant, il semble que os.Stdin.Read s'arrête jusqu'à ce qu'il reçoive un caractère de nouvelle ligne.
package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
// Input Buffer
var msg string
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanBytes)
go func() {
for {
// Prompt the user for a message
fmt.Print("client1: ")
// Scan os.Stdin, splitting on bytes
for scanner.Scan() {
if scanner.Text() == "\n" {
break
} else {
// If the character is not \n, add to the input buffer
msg += scanner.Text()
}
}
// Do something with the input buffer then clear it
fmt.Println(msg)
msg = ""
}
}()
for {
select {
// Receive a message from a client
case <-time.After(5 * time.Second):
// Write the message over the current line
fmt.Println("\rclient2: Hello")
// Prompt the user again for their message
// proving the current input buffer
fmt.Print("client1: " + msg)
}
}
}
Un exemple de sortie:
client1: Hello!
Hello!
client2: Hello
client1: Bye!
Bye!
client2: Hello
client2: Hello // Was "client1: Good " before being overwritten
client1: Bye!
Good Bye!
Toutes les idées sont grandement appréciés. Merci d'avance.
Hmm ok. Impossible de le tester pour le moment mais il semble que ce client2 ne peut sortir que lorsque vous envoyez un message. Je vais jouer avec l'idée. –
Je ne pense pas que terminal/console ne convient pas pour les opérations d'E/S asynchrones. La solution alternative est ncurses ou termbox .. – bigless
Je pense comme dans ma situation, les messages sont beaucoup plus susceptibles d'être reçus que envoyés, je pourrais avoir un seul programme de terminal pour obtenir des messages, puis un autre programme pour les envoyer. Merci pour vos efforts. J'ai regardé termbox mais il semble que beaucoup d'efforts pour pas un gros problème. –