5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
||||||
1 | ||||||
Получение XML данных по TCP порту16.08.2012, 12:19. Показов 5870. Ответов 12
Метки нет (Все метки)
Здравствуйте,
Пишу приложение, которое будет получать XML-данные по TCP, а затем писать эти данные в базу данных. Нашёл в интернете пример как отправлять и принимать XML по TCP-порту. Использовал его в своём приложении. XML отправляется, принимается, парсится и пишется в базу только, если прописать сам XML-код в тексте программы. А надо, чтобы программа открывала соединение на указанном порту и прослушивала этот порт, ожидая XML-сообщения от любого приложения (например отправки сообщения по телнету), а затем писала бы это сообщение в базу. Вопрос, как это сделать? Можете ли привести пример кода? Или дать ссылку на реализацию подобной программы. C# знаю слабо, поэтому желательны примеры кода Отправляю то что пока у меня получилось. Спасибо!
0
|
16.08.2012, 12:19 | |
Ответы с готовыми решениями:
12
Получение данных из TCP пакета Получение данных из контроллера по TCP Синхронное получение данных TCP IP Tcp client отправка и получение данных |
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
|
|
16.08.2012, 18:05 | 2 |
http://msdn.microsoft.com/ru-r... lient.aspx
http://msdn.microsoft.com/ru-r... lient.aspx Здесь в каждой из этих тем в конце есть по полному примеру реализации TCP-клиента и TCP-сервера. Достаточно скопировать в два проекта и заменить переменную server на ip-адрес и можно пользоваться
0
|
5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
|
16.08.2012, 21:11 [ТС] | 3 |
jivot, Спасибо! Почитаю. А Вы две одинаковые ссылки скинули. Вторая на tcp server должна быть?
0
|
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
|
|
16.08.2012, 21:15 | 4 |
Пардон
сервер: http://msdn.microsoft.com/ru-r... tener.aspx клиент: http://msdn.microsoft.com/ru-r... lient.aspx
1
|
5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
||||||
17.08.2012, 17:50 [ТС] | 5 | |||||
jivot, Спасибо! Заработало! То что нужно!
Сейчас вот пытаюсь сделать, чтобы TCP Server работал, как виндовая служба и также нужно реализовать многопоточность, чтобы данные от клиентов обрабатывались параллельно, а не последовательно. Взял код из примера http://msdn.microsoft.com/ru-r... tener.aspx, добавил туда парсинг XML и запись в БД и поместил это в метод
Но в итоге моя служба повисает в состоянии "В процессе запуска", но при этом она в процессах виндоуса есть и работает. Т.е. парсит сообщения от клиента и пишет их в базу. Вот пока разбираюсь с тем, что мешает ей перейти в состояние "Работает".
0
|
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
|
|
18.08.2012, 11:19 | 6 |
А сервер реализован где? В процедуре OnStart?
Если да, тогда конечно он там будет крутиться, обрабатывать данные, но служба будет думать, что она ещё не запустилась
0
|
5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
|
18.08.2012, 11:26 [ТС] | 7 |
jivot, Да, всё разобрался в чём дело было.
Сервер реализовал в отдельном методе и в процедуре OnStart запустил его в отдельном потоке, и всё нормально заработало Теперь хочу сделать, чтобы мой сервер мог получать данные одновременно с нескольких клиентов. Можно как-нибудь переделать этот код: http://msdn.microsoft.com/ru-r... ener.aspx? Я так понимаю нужно передать каждый TcpClient в отдельный поток? Как это сделать?
0
|
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
|
||||||
18.08.2012, 12:01 | 8 | |||||
Ну можно например асинхронный вызов метода ...
1
|
5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
|
20.08.2012, 12:31 [ТС] | 9 |
jivot,
Т.е. если я правильно понял, то тут создаётся отдельный поток на запись в базу и новый клиент может подключиться к серверу не дожидаясь завершения записи в базу данных?
0
|
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
|
||||||
20.08.2012, 13:46 | 10 | |||||
Что-то вроде того ...
можно использовать маркер блокировки
ну или любые другие понравившиеся методы синхронизации потоков
0
|
5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
||||||
20.08.2012, 14:15 [ТС] | 11 | |||||
jivot,
У меня вот что пока получилось:
В случае с маркером блокировки не понял: зачем блокировать доступ другим потокам к методу для записи в базу? Ведь в этом случае получается последовательная обработка данных, по одному клиенту, а не одновременные подключения и запись сразу с нескольких клиентов? И, кстати, подключения самих клиентов будут происходить последовательно? Т.е. если в один момент времени решат подключиться сразу 50 клиентов, то они всё равно ведь будут подключаться один за другим, а не все сразу?
0
|
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
|
|
20.08.2012, 15:01 | 12 |
Хм ... что значит "подключаться одновременно"? ... Сервер работает, получает подключение от одного клиента, отправляет его в отдельный поток, берет следующее подключение - отправляет в другой поток.
Подключаются они последовательно конечно ... но обсчитываются потом параллельно в разных потоках. а, ну в вашем случае блокировка не нужна, SQL Server сам расставит очередь записи и конфликтов быть не должно
1
|
5 / 5 / 3
Регистрация: 16.08.2012
Сообщений: 53
|
|
20.08.2012, 15:56 [ТС] | 13 |
Спасибо! Да я думал, что сразу одновременно все клиенты подключатся и начнут отправлять данные в базу . Хотя это и незачем, всё равно два запроса на вставку данных в таблицу в один момент времени не смогут выполняться. SQL Server один за другим их будет выполнять.
Так-то всё готово вроде. Спасибо за помощь! Добавлено через 9 минут Только у меня в отдельный поток получается что отправляется не клиент, а полученное сообщение от этого клиента...
0
|
20.08.2012, 15:56 | |
20.08.2012, 15:56 | |
Помогаю со студенческими работами здесь
13
Как происходит получение данных через протокол TCP Сообщения по TCP порту Получение Данных Из Xml Получение данных из XML Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |