![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с сокетом [D6, WinXP]
Big Joe © (2005-08-10 07:47:00)Привет всем ! Помогите пожалуйста тупому студенту с вопросам.
Мне задали задачу где должны быть две программы клиент и сервер.В клиентной части должно быть одна кнопка и один Edit
При нажатии кнопки на серверной части должно отобразиться в виде
сообщения текст с Edit-а. Заранее спасибо.
Digitman (2005-08-10 09:50:00) [1]примерно так :
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;
Bekzhan (2005-08-10 08:42:00) [2]{... Здесь идет заголовок файла и определение
формы 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;