|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Реализовал метод асинхронной отправки сообщений клиентам, но он отправляет это сообщение абсолютно всем, в том числе и самому отправителю. Как сделать так чтобы сообщение приходило всем кроме отправителя? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Попытался сделать вот так, но получаются жутки тормоза при подключении больше двух клиентов и в конце концов разрыв канала передачи( без foreach разрывов нет) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Реализация не асинхронной отправки Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
В переменной connection храниться пользователь который вызвал этот метод(отправил свой аудиопоток)- далее сообщение В _users хранятся все подключённые пользователи Принцип работы метода SendMessage: 1. в connection записывается пользователь который отослал сообщение 2. в цикле foreach переменной other присваиваются каждый пользователь чата, если other==connection то получается отправлять сообщение пользователю other не надо т.к. он сам его отправил. Суть проблемы: 1.При заходе больше двух пользователей чат начинает подвисать(очень большая задержка появляется), а потом обрыв соединения: Коммуникационный объект System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, так как его работа прервана 2.Если убрать цикл foreach, то обрывов не будет и чат будет спокойно работать с 10+ пользователей, но сообщение будет отсылаться всем ( то есть я в чате буду слышать свой голос) Клиентская часть, используется библиотека Naudio Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 22:20 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Может для начал проще сделать так: пусть отправитель не парится, а шлет быстро и всем, а уже получатель фильтрует ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2021, 12:33 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Ролг Хупин, А как можно фильтровать байтовый массив который отсылает сервер клиенту? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2021, 12:56 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Naudachu Ролг Хупин, А как можно фильтровать байтовый массив который отсылает сервер клиенту? Добавьте try catch и покажите подробности этой ошибки "Коммуникационный объект System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, так как его работа прервана" ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2021, 13:45 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Ролг Хупин, Сервер из за проверки foreach+if: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
не успевает рассылать сообщения. При двух пользователях всё работает прекрасно, при больше чем 2 пользователя сервер перестаёт отвечать(Коммуникационный объект System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, так как его работа прервана). Если убрать проверку, то есть оставить вот так: Код: c# 1. 2. 3. 4. 5.
То всё работает стабильно даже с 10 пользователями, но соответственно они слышат сами себя т.к. нет проверки if (other == connection) и следовательно сервер отправляет это сообщение всем ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2021, 14:27 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Naudachu Ролг Хупин, Сервер из за проверки foreach+if: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
не успевает рассылать сообщения. При двух пользователях всё работает прекрасно, при больше чем 2 пользователя сервер перестаёт отвечать(Коммуникационный объект System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, так как его работа прервана). Если убрать проверку, то есть оставить вот так: Код: c# 1. 2. 3. 4. 5.
То всё работает стабильно даже с 10 пользователями, но соответственно они слышат сами себя т.к. нет проверки if (other == connection) и следовательно сервер отправляет это сообщение всем Странно, при чем тут проверка. Написано "сервер отправляет это сообщение всем", но тут получение? А так: foreach (var other in _users.Keys) { if (other != connection) other.RecievMessage(" ", message); } ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2021, 17:32 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Ролг Хупин, RecievMessage - метод контракта обратного вызова. Клиент чтобы отправляет сообщение вызывает метод void SendMessage(byte[] message) реализованный на сервере и передаёт записанный массив байтов. При вызове метода SendMessage сервер вызывает метод RecievMessage(" ", message) реализованный на клиенте, при этом передаёт в него массив байтов звука. Когда метод RecievMessage вызывается на клиенте он воспроизводит этот массив байтов. Так работает дуплексные службы https://docs.microsoft.com/ru-ru/dotnet/framework/wcf/feature-details/duplex-services Но чтобы сервер не отсылал массив байтов клиенту который его же и отправил был реализован алгоритм проверки (ваш алгоритм безусловно верен): Код: c# 1. 2. 3. 4. 5.
1. НО если подключаться больше двоих клиентов, то звук начнёт подвисать очень сильно 2. НО если убрать этот алгоритм проверки, то хот 10 человек подключаться и всё будет работать, за исключением того, что они слышат сами себя Если я прикреплю проект, это даст резултат? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2021, 17:52 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Naudachu Ролг Хупин, RecievMessage - метод контракта обратного вызова. Клиент чтобы отправляет сообщение вызывает метод void SendMessage(byte[] message) реализованный на сервере и передаёт записанный массив байтов. При вызове метода SendMessage сервер вызывает метод RecievMessage(" ", message) реализованный на клиенте, при этом передаёт в него массив байтов звука. Когда метод RecievMessage вызывается на клиенте он воспроизводит этот массив байтов. Так работает дуплексные службы https://docs.microsoft.com/ru-ru/dotnet/framework/wcf/feature-details/duplex-services Но чтобы сервер не отсылал массив байтов клиенту который его же и отправил был реализован алгоритм проверки (ваш алгоритм безусловно верен): Код: c# 1. 2. 3. 4. 5.
цепляйте, но есть смутное подозрение, что вы где-то ошибаетесь, думая, что проверка может до такой степени повлиять. 1. НО если подключаться больше двоих клиентов, то звук начнёт подвисать очень сильно 2. НО если убрать этот алгоритм проверки, то хот 10 человек подключаться и всё будет работать, за исключением того, что они слышат сами себя Если я прикреплю проект, это даст резултат? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2021, 12:35 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Ролг Хупин, я осознал свою ошибку, мне нужно сделать этот метод асинхронным: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Перепробовал множество вариантов, но не получается ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2021, 17:38 |
|
Асинхронная отправка сообщений WCF пользователям чата
|
|||
---|---|---|---|
#18+
Ролг Хупин, Можешь помочь? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2021, 20:36 |
|
|
start [/forum/topic.php?fid=19&tid=1396629]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 250ms |
total: | 379ms |
0 / 0 |