Форум: "Сети";
Текущий архив: 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.038 c