2014-01-08 2 views
2

У меня есть этот код здесьданные не передаются по каналам

https://gist.github.com/ChasingLogic/8324442

Я пытаюсь научиться сетевому программированию с Golang это моя первая попытка параллельности и целью является эквивалентом урезанная irc, где сообщение отправляется и эходается всем подключенным клиентам.

По какой-то причине мой код никогда не пропускает данные в каналы. Если я поставлю ошибку, то в нее просто бесконечно выплюнет EOF.

+0

Что такое 'п, эээ: = conn.Read (ЬиЙ [0:])' должен делать, если ЬиЙ пуст? Кажется, вы никогда не заселяете свои каналы. – Volker

+0

Прошу прощения, я не совсем понимаю, что вы имеете в виду. Я думал, что conn.Read будет блокироваться до тех пор, пока данные не будут отправлены? Также не уверен, что такое заселение моих каналов. Я обыскал godoc и эффективно обходил его и ничего не придумал. – ChasingLogic

+0

@ChasingLogic означает, что «var buf [] byte» приводит к пустому фрагменту buf. Попробуйте «buf: = make ([] byte, 1024)». – Kluyg

ответ

3

У вас есть две проблемы:

  1. Пусто БУФ в handleClient
  2. Тупик между отправителем и получателем

Первый легко - просто использовать «БУФ: = сделать ([] байт, 1024) "вместо" var buf [] byte ".

Второй более подробный.

В handleClient у вас есть

fmt.Println(string(buf[0:n])) 
mesg <- buf[0:n] 
fmt.Println(mesg) 
ind <- n 
fmt.Println(ind) 

Таким образом, вы отправить сообщение, а затем - длина сообщения. Но на стороне приемника у вас есть:

n := <-ind 
fmt.Println("N recieved") 
buf := <-mesg 
fmt.Println("Channels recieved") 

Таким образом, вы ожидаете длину сообщения до самого сообщения. Таким образом, существует тупик: отправитель ожидает, что кто-то получит сообщение перед отправкой длины, но получатель ожидает получения длины сообщения до получения сообщения.

Просто измените handleClient иметь противоположный порядок, и он будет работать:

fmt.Println(string(buf[0:n])) 
ind <- n 
mesg <- buf[0:n] 
fmt.Println(mesg) 
fmt.Println(ind) 
+0

Почувствуйте себя настоящим немым. Огромное спасибо. – ChasingLogic

+0

@ChasingLogic Нет проблем, вот как мы все учимся :) Кстати, вам не нужен канал длины сообщения вообще, структура среза уже имеет длину внутри него. И обратите внимание на проблемы параллелизма - у вас есть ресурс (буфер), общий для многих параллельных goroutines (один отправляет и много получает). «mesg <- buf [0: n]» отправляет не копию, а только срез (который в основном является указателем на базовый массив + start pos + end pos). Таким образом, будут проблемы параллелизма, когда многие клиенты одновременно отправят много сообщений. – Kluyg

+0

oh, а также только один клиент получит отправленное сообщение, так как все клиенты заблокированы в «buf: = <-mesg», и только один (случайный) будет разблокирован, когда в канале будет сообщение, он будет прочитайте сообщение с канала, после чего канал будет пустым, поэтому другие клиенты не разблокируют/не получат сообщение. – Kluyg

Смежные вопросы