Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
NikkuL
5 / 5 / 4
Регистрация: 20.11.2015
Сообщений: 114
1

Чат на сокетах

03.01.2016, 19:05. Просмотров 2377. Ответов 12

Проблема в работе чата: отправляется только первое сообщение, а дальше всё зависает. Предположительно надо использовать асинхронные функции или что-то ещё в том же духе, но понятия не имею как.
Код сервера:
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
private async void button1_Click(object sender, EventArgs e)
{
    IPHostEntry ipHost = Dns.GetHostEntry("localhost");
    IPAddress ipAddr = ipHost.AddressList[0];
    IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
    //Создаем сокет Tcp/Ip
    Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    //Назначаем сокет локальной конечной точке и слушаем входящие сокеты
    richTextBox1.AppendText("Ожидаем соединение через порт " + ipEndPoint);
    try
    {
        sListener.Bind(ipEndPoint);
        sListener.Listen(10);
        //Начинаем слушать соединения                               
        Socket handler = sListener.Accept();
        string data = null;
        //Мы дождались клиента, пытающегося с нами соединиться
        byte[] bytes = new byte[1024];
        int bytesRec = handler.Receive(bytes);
        data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
        //Показываем данные на консоли
        richTextBox1.AppendText("Полученный текст: " + data + "\n\n");
        //Отправляем ответ клиенту
        string reply = "Отправленное сообщение " + data;
        byte[] msg = Encoding.UTF8.GetBytes(reply);
        handler.Send(msg);
        handler.Shutdown(SocketShutdown.Both);
        handler.Close();                
    }
    catch (Exception ex)
    {
        richTextBox1.AppendText(ex.ToString());
    }
}
Код клиента не думаю что стоит скидывать.

Добавлено через 3 часа 34 минуты
Все вымерли чтоль?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 19:05
Ответы с готовыми решениями:

Не работает чат на сокетах
Привет. Есть чат на сокетах но, при попытке коннекта программа просто зависает. Уже окончательно...

Чат на сокетах (TCP)
как реализовать? в принципе работал с сокетами, но не понимаю как конкретно чат делается? ведь...

FTP на сокетах
Есть код: using System; using System.Text; using System.IO; using System.Net; using...

Сервер на сокетах TCP
Здравствуйте.Пробую по примеру сделать простенький чат на TCP. В клиенте отсылаю сообщения, но до...

Асинхронный сервер на UDP-сокетах
Хай. Я как-то писал асинх. сервер с использованием TCP-протокола и все получилось очень круто,...

12
Woldemar89
TheGreatCornholio
1217 / 699 / 281
Регистрация: 30.07.2015
Сообщений: 2,375
Завершенные тесты: 1
03.01.2016, 19:33 2
Цитата Сообщение от NikkuL Посмотреть сообщение
Все вымерли чтоль?
Ага, после новогодней ночи.
1
NikkuL
5 / 5 / 4
Регистрация: 20.11.2015
Сообщений: 114
04.01.2016, 00:44  [ТС] 3
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Ага, после новогодней ночи.
И ни кто не поможет?
Эхх... Тлен, пичаль, дипрессия
0
insite2012
Модератор
Эксперт .NET
4890 / 3842 / 1097
Регистрация: 12.10.2013
Сообщений: 11,101
Записей в блоге: 2
04.01.2016, 08:32 4
Цитата Сообщение от NikkuL Посмотреть сообщение
И ни кто не поможет?
С сокетами не помогу, но если устроит чат на WCF, то сюда посмотрите.

Добавлено через 7 часов 41 минуту
 Комментарий модератора 
NikkuL, не создавайте стопицот тем с одним вопросом. Быстрее вам от этого не ответят!
1
04.01.2016, 08:32
Woldemar89
TheGreatCornholio
1217 / 699 / 281
Регистрация: 30.07.2015
Сообщений: 2,375
Завершенные тесты: 1
04.01.2016, 10:44 5
Цитата Сообщение от NikkuL Посмотреть сообщение
И ни кто не поможет?
Тема избита ногами до состояния близкого к летальному, проще рабочие примеры поискать и разобрать.
1
NikkuL
5 / 5 / 4
Регистрация: 20.11.2015
Сообщений: 114
05.01.2016, 00:21  [ТС] 6
Цитата Сообщение от Woldemar89 Посмотреть сообщение
поискать и разобрать
Либо я плохо ищу, либо я плохо разбираю -__-
0
Woldemar89
TheGreatCornholio
1217 / 699 / 281
Регистрация: 30.07.2015
Сообщений: 2,375
Завершенные тесты: 1
05.01.2016, 07:24 7
Цитата Сообщение от NikkuL Посмотреть сообщение
Либо я плохо ищу, либо я плохо разбираю -__-
По этим ссылкам примеры разбирал?

http://metanit.com/sharp/net/3.2.php
http://professorweb.ru/my/csharp/web/level3/3_2.php

Цитата Сообщение от NikkuL Посмотреть сообщение
отправляется только первое сообщение, а дальше всё зависает.
Цикла обработки сообщений не вижу.
1
NikkuL
5 / 5 / 4
Регистрация: 20.11.2015
Сообщений: 114
05.01.2016, 23:56  [ТС] 8
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Цикла обработки сообщений
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void button1_Click(object sender, EventArgs e)
{
    //Назначаем сокет локальной конечной точке и слушаем входящие сокеты
    richTextBox1.AppendText("Ожидаем соединение через порт " + ipEndPoint);
    sListener.Bind(ipEndPoint);
    sListener.Listen(0);
    handler = sListener.Accept();
    while (true)
    {
        data = null;
        //Мы дождались клиента, пытающегося с нами соединиться
        byte[] bytes = new byte[1024];
        int bytesRec = handler.Receive(bytes);
        data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
        richTextBox1.AppendText("Принято:" + data + "\n\n");
        //Отправляем ответ клиенту
        string reply = "Доставлено!";
        byte[] msg = Encoding.UTF8.GetBytes(reply);
        handler.Send(msg);
    }
}
P.S.: немного переработал приложение. Новая ошибка - форма сервера просто висит, хотя должна выводить в richTextBox сообщения от клиента, но сервер посылает ответные сообщения клиенту.

Цитата Сообщение от Woldemar89 Посмотреть сообщение
http://metanit.com/sharp/net/3.2.php
http://professorweb.ru/my/csharp/web/level3/3_2.php
С последнего и писал, но фишка то в том что консоль как и так, как бы "висит". А у меня то на формах.

Я конечно особо не в курсе, но наверно есть вариант использования потоков? Но, скажу честно, опыта с ними мало.

Добавлено через 15 минут
Запихал весь код выше с кнопки в функции conn, далее запили поток, теперь при нажатии на кнопку ничего не зависает, клиент получает сообщения о доставке от сервера, но проблема с выводом сообщений от клиента осталась - напрямую обратиться к richTextBox из потока нельзя. Как же тогда вывести сообщение клиента из потока?
0
Woldemar89
TheGreatCornholio
1217 / 699 / 281
Регистрация: 30.07.2015
Сообщений: 2,375
Завершенные тесты: 1
06.01.2016, 10:46 9
Лучший ответ Сообщение было отмечено NikkuL как решение

Решение

Цитата Сообщение от NikkuL Посмотреть сообщение
напрямую обратиться к richTextBox из потока нельзя
C#
1
Form.CheckForIllegalCrossThreadCalls = false; //так лучше не надо, но типа можно
C#
1
this.Invoke(new Action(() => {richTextBox1.Text += text;})); //так должно прокатить
Цитата Сообщение от NikkuL Посмотреть сообщение
А у меня то на формах.
Ну так и ищи примеры на формах!!!

Цитата Сообщение от NikkuL Посмотреть сообщение
но наверно есть вариант использования потоков?
Простые потоки, сокеты, сокеты с потоками, обращение к контролам из другого потока -
темы, такие же заезженные, как и вывод матрицы у студентов, перестань меня пытать уже
Решений полно, что в инете, что на форуме.
1
Woldemar89
TheGreatCornholio
1217 / 699 / 281
Регистрация: 30.07.2015
Сообщений: 2,375
Завершенные тесты: 1
06.01.2016, 11:00 10
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Ну так и ищи примеры на формах
Пошагово.

1. Тыц.
2. Первая ютубовская ссылка.
3. Download link под видео.
4. Скачать сможешь?

Ну и, собственно говоря, итог... Это было несложно? Ведь так?
2
Миниатюры
Чат на сокетах  
NikkuL
5 / 5 / 4
Регистрация: 20.11.2015
Сообщений: 114
06.01.2016, 14:17  [ТС] 11
Цитата Сообщение от Woldemar89 Посмотреть сообщение
3. Download link под видео.
Знаю я задолбал
По ссылке выкидывает ошибку 404, но впрочем я уже разобрался со всем, благодарю
0
Woldemar89
TheGreatCornholio
1217 / 699 / 281
Регистрация: 30.07.2015
Сообщений: 2,375
Завершенные тесты: 1
06.01.2016, 14:21 12
Цитата Сообщение от NikkuL Посмотреть сообщение
По ссылке выкидывает ошибку 404
У меня все норм.
Цитата Сообщение от NikkuL Посмотреть сообщение
но впрочем я уже разобрался со всем
Воткнул в свою прогу this.Invoke(new Action(() => {richTextBox1.Text += text;})); ?
Цитата Сообщение от NikkuL Посмотреть сообщение
благодарю
Да пожалуйста
1
NikkuL
5 / 5 / 4
Регистрация: 20.11.2015
Сообщений: 114
08.01.2016, 00:18  [ТС] 13
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Воткнул
Оно самое!

Добавлено через 14 минут
Цитата Сообщение от Woldemar89 Посмотреть сообщение
3. Download link под видео.
И с этим тож разобрался: пришлось прокси врубать.
0
08.01.2016, 00:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2016, 00:18

Клиент-серверное приложение на сокетах
всем привет. Пытаюсь написать свой первый Клиент-сервер на WinForms. Пока успехом не пахнет...

Почему не работает сервер на сокетах?
Подскажите, что не так, почему не работает? Клиент: using System; using...

Асинхронный сервер на сокетах.Как зациклить ?
Итак у меня есть код сервера который только принимает данные.Пожалуйста объясните в какой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru