Структура программирования, программирование, языки программирования, книги программирование На сайте представлена информация про программирование в Интернете и работу  

Добавление своего пункта в контекстное меню, в компоненте 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, Клиент-серверное приложение

Только здесь 1000 посетителей на Ваш сайт всего за 3 у.е.!

- Пишу клиент-серверное приложение. Опыта в этом нет. Серверная часть выдает ошибку на методе чтения, когда клиент посылает серверу данные.Ошибка: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], для этого есть удобная кнопочка наверху.

- У меня сейчас все работает с неблокирующим сокетом. А с блокирующим еще пробовала...

Интернет казино     Онлайн игры     Увеличение члена     Купить DVD


Главная страница | opengl программирование | программирование бейсик | программирование интерфейса | программирование pocket | программирование заказы | задача динамического программирования | prolog программирование | стохастическое программирование | процедурное программирование | история языков программирования | структура программирования | языки программирования высокого уровня | программирование устройств | функции программирования | программирование siemens | списки программирование | язык программирования java | олимпиада программирование | программирование мобильных телефонов | дипломная работа программирование | программирование palm | Ссылки

Все про процедурное программирование