Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Помогите с сокетом   Найти похожие ветки 

 
Big Joe ©   (2005-08-10 07:47) [0]

Привет всем ! Помогите пожалуйста тупому студенту с вопросам.
Мне задали задачу где должны быть две программы клиент и сервер.В клиентной части должно быть одна кнопка и один Edit
При нажатии кнопки на серверной части должно отобразиться в виде
сообщения текст с Edit-а. Заранее спасибо.


 
Bekzhan   (2005-08-10 08:42) [1]

{... Здесь идет заголовок файла и определение
   формы TForm1 и ее экземпляра Form1}

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     {Определяем порт и запускаем сервер}
     ServerSocket1.Port := 1025;
     {Метод Insert вставляет строку в массив в указанную позицию}
     Memo2.Lines.Insert(0,"Server starting");
     ServerSocket1.Open;
   end;
 
   procedure TForm1.Button2Click(Sender: TObject);
   begin
     {Останавливаем сервер}
     ServerSocket1.Active := False;
     Memo2.Lines.Insert(0,"Server stopped");
   end;
 
   procedure TForm1.ServerSocket1Listen(Sender: TObject;
     Socket: TCustomWinSocket);
   begin
     {Здесь сервер "прослушивает" сокет на наличие клиентов}
     Memo2.Lines.Insert(0,"Listening on port "+IntToStr(ServerSocket1.Port));
   end;
 
   procedure TForm1.ServerSocket1Accept(Sender: TObject;
     Socket: TCustomWinSocket);
   begin
     {Здесь сервер принимает клиента}
     Memo2.Lines.Insert(0,"Client connection accepted");
   end;
 
   procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
     Socket: TCustomWinSocket);
   begin
     {Здесь клиент подсоединяется}
     Memo2.Lines.Insert(0,"Client connected");
   end;
 
   procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   begin
     {Здесь клиент отсоединяется}
     Memo2.Lines.Insert(0,"Client disconnected");
   end;
 
   procedure TForm1.ServerSocket1ClientError(Sender: TObject;
     Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
     var ErrorCode: Integer);
   begin
     {Произошла ошибка - выводим ее код}
     Memo2.Lines.Insert(0,"Client error. Code = "+IntToStr(ErrorCode));
   end;
 
   procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
   begin
     {От клиента получено сообщение - выводим его в Memo1}
     Memo2.Lines.Insert(0,"Message received from client");
     Memo1.Lines.Insert(0,"> "+Socket.ReceiveText);
   end;
 
   procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
     Socket: TCustomWinSocket);
   begin
     {Теперь можно слать данные в сокет}
     Memo2.Lines.Insert(0,"Now can write to socket");
   end;
 
   procedure TForm1.ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
     var ClientSocket: TServerClientWinSocket);
   begin
     Memo2.Lines.Insert(0,"Get socket");
   end;
 
   procedure TForm1.ServerSocket1GetThread(Sender: TObject;
     ClientSocket: TServerClientWinSocket;
     var SocketThread: TServerClientThread);
   begin
     Memo2.Lines.Insert(0,"Get Thread");
   end;
 
   procedure TForm1.ServerSocket1ThreadEnd(Sender: TObject;
     Thread: TServerClientThread);
   begin
     Memo2.Lines.Insert(0,"Thread end");
   end;
 
   procedure TForm1.ServerSocket1ThreadStart(Sender: TObject;
     Thread: TServerClientThread);
   begin
     Memo2.Lines.Insert(0,"Thread start");
   end;
 
   procedure TForm1.Button3Click(Sender: TObject);
    var i: Integer;
   begin
     {Посылаем ВСЕМ клиентам сообщение из Edit1}
     for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin
      ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);
     end;
     Memo1.Lines.Insert(0,"< "+Edit1.Text);
   end;


 
Digitman ©   (2005-08-10 09:50) [2]

примерно так :

1. на кл.стороне - компонент TClientSocket со след.свойствами :

- ClientType = ctBlocking
- Address = строковое представление IP-адреса, по которому ожидается активность серверной части, например, "127.0.0.1"
- Port = номер порта, который использует сервер для прослушивания входящих запросов

по нажатию на кнопку :

var Cnt: Integer;

with ClientSocket do begin
Open;
try
  Cnt := Length(Edit.Text);
  Socket.SendBuf(Cnt, SizeOf(Cnt));
  Socket.SendBuf(PChar(Edit.Text)^, Cnt);
finally
 Close;
end;
end;

2. на серв.стороне - компонент TServerSocket со след.свойствами :

- stServerType = stNonBlocking;
- Port = предпочтительный номер порта для прослушивания вх.запросов
- Active = True

//статические переменные
var
 s: String;
 Cnt, BytesRead: Integer;
 BytesLeftToRead: Integer = SizeOf(Cnt);
 State: Integer;

в обработчике события ServerSocket.OnClientRead:

 with Socket do begin
  case State of
   0: begin //режим приема длины строки
       BytesRead := ReceiveBuf(PByteArray(@Cnt)[SizeOf(Cnt) - BytesLeftToRead]^, BytesLeftToRead);
       Dec(BytesLeftToRead, BytesRead);
       if BytesLeftToRead = 0 then //длина строки принята полностью
         begin
           State := 1; //переход в режим приема самой строки
           BytesLeftToRead := Cnt;
           SetLength(s, Cnt);
         end;
      end;
   1: begin //режим приема самой строки
       BytesRead := ReceiveBuf(s[Cnt - BytesLeftToRead + 1], BytesLeftToRead);
       Dec(BytesLeftToRead, BytesRead);
       if BytesLeftToRead = 0 then //строка принята полностью
         begin
           State := 0; //переход в режим приема длины строки
           BytesLeftToRead := SyzeOf(Cnt);
           ShowMessage(s); //покажем принятую строку
         end;        
      end;
  end;  
 end;



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
3-1121670907
АМБ
2005-07-18 11:15
2005.11.20
Просмотр и восстановление "удаленных" записей в DBF таблицах


14-1130139299
Nikolay M.
2005-10-24 11:34
2005.11.20
Кто-нибудь ощущает магнитные бури?


2-1130418128
kyn66
2005-10-27 17:02
2005.11.20
Как удалить компоненты одним махом?


2-1130664807
John Doe
2005-10-30 12:33
2005.11.20
Перевод из String в дату


2-1130859825
Grol
2005-11-01 18:43
2005.11.20
Удалить память выделенную под нужды компонента...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский