Я строю алгоритм эха в go с несколькими инициаторами, по сути, у меня есть три функции «говорить», «слушать» и «запустить алгоритм».«talk» отправляет данные соседям, «слушает» полученные данные от соседей, оба используют каналы.Эти каналы контролируются в функциях «алгоритм выполнения», которые решают, что и кому отправлять.
По существу это:
func server(s Node, myChannel chan string){
fmt.Printf("SERVER Launching server... %s:%s \n", s.ip, s.port)
// Start listening
// We do not stop listening until the surrounding function returns (finishes)
ln, _ := net.Listen("tcp", s.ip+":"+s.port)
for {
// Accept connections
fmt.Println("SERVER waiting at ln.Accept()")
conn, err := ln.Accept()
if err != nil {
panic(err)
}
//fmt.Println("SERVER connection accepted")
// Read received message
fmt.Println("SERVER awaiting message")
message, err := bufio.NewReader(conn).ReadString('\n')
fmt.Println("SERVER message received = " + message)
if err != nil {
fmt.Println("the server is broken")
panic(err)
}
if err == nil {
// If the mmessage is not empty, then print it in the shell
if string(message) != "" {
fmt.Println("SERVER message put in channel")
myChannel <- message
}
}
}
И функция разговора как эта:
func client(myNode Node, nbour Node, myChannel chan string) {
for {
// this loop controls the sending of algorithm messages
conn, err = net.Dial("tcp", nbour.ip+":"+nbour.port)
// useful info for the user
//fmt.Println("CLIENT awaiting message to send")
// the the message to send out of the channel
messageToSend := <-myChannel
// send the message
conn.Write([]byte(messageToSend))
fmt.Println("CLIENT SENT ALG MESSAGE = " + messageToSend + "to " + nbour.ip + ":" + nbour.port)
// useful information for the user
//fmt.Printf("CLIENT Message text: " + messageToSend. + "\n")
}
Проблема в том, что эти соединения работают, находят первые несколько сообщений, затем в некоторой произвольной точке один узел отправляет сообщение, а сосед не получает его, и все останавливается.
Таким образом, мой вопрос - почемупроизвольно ли прерываются соединения, есть ли где-то параметр, указывающий, как долго оставаться открытым или сколько сообщений отправлять?Или приведенный выше код был неправильным для достижения этой цели (хотя, как я уже говорил, иногда он работает нормально, фактически иногда алгоритм завершается идеально, затем я снова запускаю точно такой же код, и он застревает в ожидании прибытия сообщений).