Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.258 c
4-1127139094
!Trinix
2005-09-19 18:11
2005.11.20
Видео режимы


6-1123135546
DmiSb
2005-08-04 10:05
2005.11.20
Сервер приложений


2-1131051303
Toxa_ua
2005-11-03 23:55
2005.11.20
~ ?


2-1131120978
Сафаров
2005-11-04 19:16
2005.11.20
Базы


2-1130746379
syte_ser78
2005-10-31 11:12
2005.11.20
как подключить dll?