4 / 4 / 1
Регистрация: 08.01.2011
Сообщений: 46
|
|||||||||||
1 | |||||||||||
Проблема с поддержанием соединения с сервером10.12.2011, 11:04. Показов 2171. Ответов 7
Метки нет Все метки)
(
Здравствуйте, Уважаемые участники форума. Пишу клиент-серверное приложение. Возникает проблема при поддержке соединения между клиентом и сервером. Нужно, чтобы клиент и сервер постоянно держали соединение.
У меня при запуске сервера все хорошо, а при запуске клиента, он повисает в памяти (окно не отображается с данными). При закрытии сервера, окно появляется вместе с данными, которые передал сервер. Если же сделать tcpSocket->close(); то все хорошо. И сервер работает и клиент отображает данные после запуска. Но по нажатии кнопки обновить, все данные пропадают с окна, поскольку сокет был закрыт. Подскажите как быть? Ниже привожу код сервера и клиента.
Вот код клиента:
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
10.12.2011, 11:04 | |
Ответы с готовыми решениями:
7
Установка соединения с MySql сервером Нет соединения с сервером Проверка соединения с сервером Ошибки соединения c сервером |
4 / 4 / 1
Регистрация: 08.01.2011
Сообщений: 46
|
|
10.12.2011, 22:38 [ТС] | 3 |
А можно пример, как это должно быть реализовано на сигналах и слотах? Или там все нужно переделывать?
0
|
Почетный модератор
11271 / 4222 / 429
Регистрация: 12.06.2008
Сообщений: 12,195
|
|||||||||||
10.12.2011, 23:24 | 4 | ||||||||||
Где-то в начале (например, в конструкторе формы) подключаешь
Т.е. должен быть какой-то особый признак того, что сервер передал все данные. Хотя, в данном случае, можно сделать, что бы сервер сам закрывал соединение, когда всё передаст.
0
|
4 / 4 / 1
Регистрация: 08.01.2011
Сообщений: 46
|
||||||
11.12.2011, 02:50 [ТС] | 5 | |||||
У меня на стороне сервера проблема. У него не выполняется функция, которая должна держать соединение. Мне так кажется... Или я не прав?
Ведь при старте сервера и клиента (первый запуск клиента) все работает, а при нажатии кнопки обновить на клиенте, сервер уже не отправляет данные. Добавлено через 2 часа 42 минуты Переделал сервер с сигналами и слотами, но не пойму, как мне избежать tcpSocket->close(); и дальнейшего зависания клиента в памяти.
Я так понимаю, каким-то образом нужно вызывать функцию IncKey(). А если закрывать сокеты, то надо вызывать tcpSocket = tcpServer->nextPendingConnection(). Если я правильно понимаю. Заранее спасибо.
0
|
11.12.2011, 23:19 | 6 |
Посмотри в примерах как правильно писать клиент-серверные приложение. Пример называется FortuneServer.
В кратце: стартуем у сервера QTcpServer::listen(...) ждем соединения, при подключении передается дескриптор сокета, создаем в сервере новый сокет, присваиваем ему этот дескриптор и работаем. При этом, что бы соединение не разрывалосm не надо сокету (ни на сервере ни на клиенте) вызывать disconnctFromHost или close
0
|
4 / 4 / 1
Регистрация: 08.01.2011
Сообщений: 46
|
|
12.12.2011, 01:29 [ТС] | 7 |
Тем более, что эта работа, просто моя контрольная в универ. Как я уже писал выше. Если у меня не вызывать tcpSocket->close(), то клиент повисает, где-то в памяти и окно не отображается. Как только стоит завершить работу сервера, окно клиента, тут же показывается на экран с данными. Народ, пусть у меня будет использоватьсяtcpSocket->close() при выполнении любого запроса к серверу (подобно веб-серверу), но какую функцию мне написать, чтобы поднимать новое соединение при завершении чтения функции IncKey().
0
|
12.12.2011, 09:06 | 8 |
потому что надо на асинхронных сокетах делать, т.е. обрабатывать сигналы а не ждать событий в основном цикле (на клиенте)
Смотри в справке как реализован Threaded Fortune Server Example там же (в справке) смотри как реализован клиент. ну если очень сложно отказаться от waitFor... тогда делай в отдельном потоке работу с сетью
0
|
12.12.2011, 09:06 | |
Помогаю со студенческими работами здесь
8
Соединения клиента с сервером Ошибка соединения с сервером Ошибка соединения с сервером Ошибка соединения с сервером Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |