|
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
|
||||||||||||||||
Клиент-Серверное приложение: как отсоединиться от сервера05.09.2012, 16:43. Показов 2362. Ответов 6
Метки нет (Все метки)
Клиент на C#
Сервер на ANSI-C Сервер подаёт структуры размером в 38байт. Клиент Получает Байты и чз BitConverter я получаю свои данные(пробовал чз Маршал оказалось слишком долго, пробовал чз Unsafe-код с применением fixed оказалось не важно почему-то встаёт поток колом будто буфер переполняется где то и данные застывают) я вывожу данные в Textbox.чз Бесконечный цикл.Данные выводятся всё нормально. Но вопрос делетанский как отсоединится от сервера?У меня есть кнопка-Коннект, нажимаю данные пошли.но после нажатия форма не активна.хочу сделать что бы при повторном нажатие происходил дисконнект. Что мне нужно для этого сделать Код Клиента. Добавлено через 57 минут
Отвечу на свой вопрос ![]()
Проблема теперь с TextBox'ом Пишет Недопустимая операция в нескольких потоках. =( Добавлено через 13 минут
Когда навожу на закрытие формы нажимаю на ЛКМ и удерживаю её то происходит чёрти что(на форме есть DataGridView в ней пишутся значения которые получается Клиент от Сервера.так вот значения начинают "прыгать" построкам и т.д.) но потом нормализуется. Почему так происходит?и как мне это исправить?и как мне сделал вывод в ТекстБокс Добавлено через 2 часа 44 минуты Подскажите пожалуйста как правильно "закрыть поток"? я предполагаю что надо подать на сервер значение "закрыть соединение"? потом закрыть у себя соединение. и тогда поток сам закроется?а за ним и основной можно закрывать(который Main)?
0
|
||||||||||||||||
| 05.09.2012, 16:43 | |
|
Ответы с готовыми решениями:
6
Клиент-серверное приложение: как написать реакцию сервера на каждое сообщение от клиента Автоматический поис сервера по заданному порту (Клиент-серверное приложение) Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени |
|
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
|
|||||||||||
| 05.09.2012, 17:00 | |||||||||||
|
про текст-бокс скажу, к контролам при многопоточности обращаюсь исключительно так:
1
|
|||||||||||
|
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
|
|
| 05.09.2012, 17:08 [ТС] | |
|
Спасибо за текст бокс)).а вот по изящнее как сделать?я просто в потоках не силён=(.знаю лишь основы потоков. Я как понимаю Abort() останавливает поток(грубо говоря делает "паузу")?
Нельзя ли проще у себя сделать client.Close(), а после поток сам закроется? или я не прав? (где TcpClient client)P.S.: Почему На ТекстБокс ругнулся, а на table.Rows[0].Cells[1].Value = BitConverter.ToSingle(buf12, i - 40); нет?
0
|
|
|
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
|
|||||||||||
| 05.09.2012, 17:32 | |||||||||||
|
а черт его знает, может таблица создавалась в том же потоке, где изменяется её значение, а текст-бокс по другому?
а по поводу потоков и клиентов: у тебя в потоке нетворкСтрим постоянно читает байты, в то время как определяется видом "client.GetStream();". при закрытии клиента без завершения потока я думаю у тебя нетворкСтрим выдаст ошибку о отключенности клиента. в обработчике этой ошибки стоит закрытие клиента, что собственно вызывет ещё одну ошибку, т.к. клиент и так закрыт(а может и не вызывет, я с сокетами работал постоянно)). после или выдачи, или обработки данной ошибке нетворкстрим заново попытается считать с клиента сообщение, заново выдаст ошибку и т.д. мой совет: сделать цикл не вечным, в условие поставить булевскую переменную, означающую подключенность клиента. при отключении выставлять её в false. поток всёже желательно завершить, при чем по моему не особо важно каким методом, Abort или Join. поэкспериментируй и с тем и с тем, какой будет работать лучше - тот и оставь) Abort: Кликните здесь для просмотра всего текста
Join: Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
|
|
| 05.09.2012, 17:41 [ТС] | |
|
1.Спасибо за подробный ответ. Т.е. я делаю что то вроде
while(client.Connected) ? 2.Т.е. При нажатие на Дисконнект(я пишу client.Close() после _thread.Abort() и всё?) 3.Да вы правы у меня НетворкСтрим вываливал кучу МессаджБоксов-_-. 4.Мне надает покоя что данные идут в 1сек - 1000структур. как мне правильно сделать?подать серверу что пора закрыватся и _thread.Abort() или делать client.Close();_tread.Abort()? 5.С текстБоксом стало понятно..а если мне надо ещё выводить 3 графика от переменных которые я получаю..делать 3 BeginInvoke?
0
|
|
|
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
|
||||||
| 05.09.2012, 18:03 | ||||||
|
1. да
2. если у клиента нет метода .Disconect(..); то почти. потом кое-какие вызовы методов придётся заключить в try-catch, так как иногда срабатывает двойное отключение, а попытка отключить то что уже отключено часто заканчивается Exception-ом. 5.при обращении к контролам из любого потока кроме базового (а в данном случае получение данных как раз в другом потоке) надо BeginInvoke или эквивалент оному) правда он позволяет записывать и не по одной операции
1
|
||||||
|
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
|
||||||||||||||||
| 06.09.2012, 13:11 [ТС] | ||||||||||||||||
|
2.Насколько я помню то в TcpClien нет метода Disconnet есть Close.Но смысл этого не меняет)
Пишут на форумах что Abort или Join это тоже самое что плевать Омоновцу в лицо , в надежде что ничего не будет. Пишут что в Thread _thread = new Thread(new ThreadStart(СтартПроцесс)); В методе SConnect должна быть какая то переменная отвечающая за "конец" (Логичнее указать некую булеву переменную Б1, потом в Вашей функции СтартПроцесс выполнять процесс до тех пор пока Б1 = труе) Но у меня Данные могут идти бесконечно=(.Не могу понять как правильно закрыть поток=( Т.е. Сначала надо закрыть соединение.Потом присвоить переменной что соединение закрыто.Потом как то поток сам закроется?Беда читаю про потоки в rsdn но что то понять не могу как мне тут поступить Добавлено через 14 часов 18 минут 1.когда я делаю чз BeginInvoke значение "идут" в текст боксе, чз пару секунд они все обнуляются далее снова появляются значения и снова обнуляются. Как это исправить? 2.делал тоже самое но чз Invoke..значения идут..но при дисконнекте поток уходит в WaitSleepJoin а статус его True; Если пункт 1. не удачно выбран в моём случае тогда как этот пункт исправить? Добавлено через 3 минуты
Проблема в том что с TextBox'ом работает Invoke
Помогите вызвать 3 разных Chart'a из другого потока Invoke,BeginInvoke не помогают..думаю уже делать
0
|
||||||||||||||||
| 06.09.2012, 13:11 | |
|
Помогаю со студенческими работами здесь
7
Как написать клиент-серверное приложение Как написать клиент-серверное приложение
Как создать простенькое клиент-серверное приложение Как написать клиент-серверное приложение для управления COM портом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|