| Структура программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Добавление своего пункта в контекстное меню, в компоненте ActivX Как временно отключить навигацию по DBGrid, читай название....:) Шаг в кикле., Как сделать? Clipboard в Stringgrid StringGrid Report'ы ! QReport - большой глюк !!!, Кто с какимы Report'ами работает ? Вывод вещественного числа, .... Crystal 8.5 & Delphi Шифровка ClientSocket Отлавливание соединения с сокетом Последовательное переключение раскладки клавиатуры ЦЕННАЯ ИДЕЯ ДЛЯ .... знатотков своего дела есть ли компонеты для чтения/записи в dbx ? Как нарисовать и стереть линию на объекте Screen?, проблема в стирании вопрос по SendMessage, как юзать SendMessage или keybdevent работа с КАМАК, передача данных от компьютера КАМАКу Как отловить двойной клик на рабочем столе, Без Хука с DLL Управление мышкой Мне надо будет в скором времени вести курсы!!!, по Дельфи!!! Помогите в написании программы компоненты для доступа к Oracle ODAC - глючат..., Oracle Data Access Component v.3.50 Работа с окнами... Вопрос о ListBox1 Вертикальный DBGrid, Как поля записи расположить вертикально Delphi+MS SQL 7, Delphi+MS SQL 7 Delphi -> MSSQL, бэкофис для сайта Как Вы относитесь к курящим девушкам? Игра точки, замкнутая область Вывод Ресурсы, Работа с ресурсами Как сделать несворачиваемую ничем форму что происходит с портом при port[$22]:=2, это импульс или..... Как написать прогу, Как написать прогу Lang Есть ли функция, которая возвращает ClientRect, относительно системы координат монитора? TClientSocket, TServerSocket, Клиент-серверное приложение Вторая копия программы + функция Про DragDrop файлов ошибка при запуске программы Работа с портами в Windows NT 1) Как открыть *.exe фаил в Tmemo, 2) Как перевести текст из Dos в Windows Запись и чтение ini, Не знаю как записать или прочитать ini Люди, у кого есть мануалы или эл.книги по дельфи 5 Pages приведи пример Query, Pages приведи пример Query,пожалуйста DragDropInterenet помогите найти, Никак не могу найти DragDropInternet.pas Помогите совместить два исходника в один., Прога, работ-щая как WipeInfo Коее что про строки и ListView Как программно изменить системное время Windows получить код цвета Richedit и разделения по странично, Проблемы при печати FastLib База данных, База данных Вопрос по поводу обработки текста...., ... Создание баз данных в делпхи Как сделать прозрачной часть компонента? Как сделать прозрачный компонент, наследованный, от TCustomControl OnMouseEnter, OnMouseExit, TSpeedButton Как сделать непрозрач элементы в прозрач окне? Знающим паскаль, Как инициализировать массив? Delphi X, Delphi X Ошибка Tbitmap, Не могу понять Дельфа не может найти API функцию BitBit Пуста ли корзина?, API Просьба. and, or, not ..., как корректно выбрать значения? Как открыть окно настройки даты и времени Windows, Запуск программы из своего приложения Скрыть Border у TPageControl TListView и vsReports, Заголовки... помогите, пожалуйста напишите ответ |
Платные хостинги Раскрутка сайта Книги по программированию TClientSocket, TServerSocket, Клиент-серверное приложение
- Пишу клиент-серверное приложение. Опыта в этом нет. Серверная часть выдает ошибку на методе чтения, когда клиент посылает серверу данные.Ошибка:Read Error 59: AN unexpected network error occurred;По ходу вопрос: свойство Service классов TClienSocket и TServerSocket, что должно содержать в моем случае?вот код:Клиент:var i : byte; ClientSocket1: TClientSocket; StreamSocket : TWinSocketStream; CN : array[0..10] of char; LenCN: integer; AddCN: Pointer; strCN : string;begin ClientSocket1 := TClientSocket.Create(nil); if ClientSocket1.Active then ClientSocket1.Close; ClientSocket1.Host := '10.10.100.24'; ClientSocket1.Address := '10.10.100.24'; ClientSocket1.Port := 7770; ClientSocket1.ClientType := ctBlocking; ClientSocket1.Open; Sleep(400); strCN := 'CompName'; FillChar(CN, 11, 0); StrPCopy(CN, strCN); StreamSocket := TWinSocketStream.Create(ClientSocket1.Socket, 60000); StreamSocket.Write(CN, Length(CN)); Sleep(1000); StreamSocket.Free; ClientSocket1.Socket.Close;end.Сервер:var ServerSocket1: TServerSocket; StreamSocket : TWinSocketStream; Buffer : array[0..10] of char; sRcvMsg : string; T : TDateTime; TimeInt : extended; LenMsg : integer;begin sRcvMsg := 'Test Passed'; ServerSocket1 := TServerSocket.Create(nil); if ServerSocket1.Active then ServerSocket1.Close; ServerSocket1.Port := 7770; ServerSocket1.ServerType := stThreadBlocking; ServerSocket1.ThreadCacheSize := 4; ServerSocket1.Socket.Listen('Имя сервера', '10.10.100.24', '', 7770, 4); T := Now; FillChar(Buffer, 11, 0); StreamSocket := TWinSocketStream.Create(ServerSocket1.Socket, 10000); repeat if not StreamSocket.WaitForData(10000) then begin Application.ProcessMessages; SaveToFile(FloatToStr((Now-T)*SecsPerDay)); end else begin LenMsg := StreamSocket.Read(Buffer, 11); if LenMsg <> 0 then begin sRcvMsg := StrPas(Buffer); SaveToFile(sRcvMsg); Break; end else SaveToFile('Nothing read'); end; until (Now - T)*SecsPerDay > 240; SaveToFile(sRcvMsg); TimeInt := (Now - T)*SecsPerDay; SaveToFile(FloatToStr(TimeInt)); if ServerSocket1.Active then ServerSocket1.Close;Заранее благодарю за ответ! - Прежде чем общаться, надо дождаться соеденения. Посмотри для сервера событие OnGetThread - его тебе нужно обработать. Для клиента тоже неплохо бы дождаться соеденения, а потом уж посылать. - Да, позволь пару реккомендаций.Создай какой-нибудь класс типа сесии TSession - который будет описывать конкретное соеденение.По возможности его лучше сделать максимально абстрактным - включить в него метод отсылки данных, событие сигнализирующие о приеме данных.Я лично создавал в таком классе два TMemoryStream: StreamIn и StreamOut, виртуальный метод DataAccepted - вызывается когда принимается очередная порция данных, а также переменную типа TCustomWinSocket - значение которой задавалось при устонавлении соеденения и через нее сессия и обменивалась данными. Над таким классом удобнее определять наследников типа TClientSession и TServerSession - для описания твоего протокола. Я помниться тоже начинал как-то без опыта клиент-сервера писать, со своим протоколом. Все оказалось не так просто, как казалось в начале. Одним из неприятных моментов было как раз то, что VCL-ные сокеты дают мало пространства для абстракции плюс к этому возникают в них какие-то непонятные глюки. Возможно лучше воспользоваться PowerSock от NetMasters - он такой более универсальный. Или TCPServer и TCPClient от Indy - в них никакой универсальности, но на вид гораздо более удобны. - Fantasist, спасибо большое за советы! - Когда я устанавливаю ClientType и ServerType = ctNonBlocking, то клиент соединяется с сервером и сервер реагирует на событие OnClientConnect. Если же ставлю ClientType = ctBlocking и ServerType = ctThreadBlocking, то соединения не происходит. В чем проблема? Какая разница для самого соединения? - А ты уверена, что соеденения не происходит? Я клиента никогда блокирующим не делал - у меня блокирующий только сервер. В последний раз я, правда, так сделал, когда понял, что без блокирующего сервера не обойтись, а клиента переделывать не стал. Так вот разница есть, и есть она именно на уровне сокетов Windows. Для сервера VCL-ный сокет с ctThreadBlocking создает отдельный поток для каждого соеденения, но перед этим генерирует событие OnGetThread, в котором тебе и нужно подставить свой поток. Правда соеденение в любом случае, по идее, должно устанавливаться. Попробу клиента сделать не блокирующим. - То что написал Serg - это годиться для НЕ блокирующего сокета. Но для него схему можно и получше придумать, но даже с хорошой схемой, не блокирующий сервер не способен обслуживать множество соеденений. - Спасибо, но у меня и так все работает А поповоду неблокирующего сервера - он у меня тоже работал, для многих подключений пока надо было только принять запрос и отправить ответ. Ка только понадобилось вести, так сказать, диалог с клиентом, тут то он и обламался в сфере приема информации.Всместо модератора:Старайтесь заключать листинги в теги [CODE] [/CODE], для этого есть удобная кнопочка наверху. - У меня сейчас все работает с неблокирующим сокетом. А с блокирующим еще пробовала... |