18. juni 2002 - 12:08Der er
10 kommentarer og 1 løsning
Dynamisk datastruktur af ClientSocket
Jeg har et program med en ServerSocket hvor et antal Clienter udefra kan connecte sig op Meningen er så at ServerSocket’en skal ’stille’ videre til en anden IPAdr+Port.
ServerSocket’en skal altså fungere som et slags relæ eller knudepunkt hvor datastrømmen flyder Igennem, jeg kan sagtens få det til at virke med flere Clienter ind i Serveren og en udgående linie idet jeg kan adskille de forskellige Clienter fra hinanden med det unike nr. som serveren tildeler med Socket.SocketHandle.
Mit problem er at oprette flere linier ud, hvordan får jeg fat i den rigtige udgående linies OnRead event og sendt hvad der kommer ind til den rigtige indgående Client via min ServerSocket ?
procedure TForm1.ssRelaeClientConnect(Sender: TObject; Socket: TCustomWinSocket); var HandleIn: Integer; begin HandleIn := Socket.SocketHandle; //Memo1.Lines.Add('connect from: '+IntToStr(HandleIn)); with TClientSocket.Create(Form1) do begin Host := 'localhost'; Port := 801; Tag := HandleIn; OnConnect := csOutConnect; OnRead := csOutRead; OnDisconnect := csOutDisconnect; Active := True; // ShowMessage('csOut created: '+IntToStr(Tag) ); end; end;
procedure TForm1.ssRelaeClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); var i, HandelIn : integer; cs: TClientSocket; begin HandelIn := Socket.SocketHandle; Memo1.Lines.Add('disconnect from: '+IntToStr(HandelIn)); for i := 0 to ComponentCount-1 do begin if (Components[i] is TClientSocket) then begin cs := (Components[i] as TClientSocket); if cs.Tag = HandelIn then cs.Active := False
end; end; end;
procedure TForm1.csOutConnect(Sender: TObject; Socket: TCustomWinSocket); var cs : TClientSocket; begin if (Sender is TClientSocket) then begin cs := (Sender as TClientSocket); Memo1.Lines.Add('Connect from: '+IntToStr(cs.Tag)); end; end;
procedure TForm1.csOutRead(Sender: TObject; Socket: TCustomWinSocket); var i, HandelIn : Integer; cs : TClientSocket; begin if (Sender is TClientSocket) then begin cs := (Sender as TClientSocket); for i := 0 to ssRelae.Socket.ActiveConnections -1 do if cs.Tag = ssRelae.Socket.Connections[i].SocketHandle then ssRelae.Socket.Connections[i].SendText(Socket.ReceiveText); end; end;
procedure TForm1.csOutDisconnect(Sender: TObject; Socket: TCustomWinSocket); var cs : TClientSocket; begin if (Sender is TClientSocket) then begin cs := (Sender as TClientSocket); //ShowMessage('On disconnect'+IntToStr(cs.Tag)); //HUSK DU MANGLER METODE TIL AT FREE MED end; end;
procedure TForm1.ssRelaeClientRead(Sender: TObject; Socket: TCustomWinSocket); var i, HandelIn : integer; inText : String; cs: TClientSocket; begin HandelIn := Socket.SocketHandle; InText := Socket.ReceiveText; Memo1.Lines.Add(IntToStr(HandelIn) + ' Mesage: '+inText); for i := 0 to ComponentCount-1 do begin if (Components[i] is TClientSocket) then begin cs := (Components[i] as TClientSocket); if cs.Tag = HandelIn then cs.Socket.SendText(inText) end; end; end;
procedure TForm1.ssDummyClientRead(Sender: TObject; Socket: TCustomWinSocket); var inStr : String; i, Con : Integer; begin Con := Socket.SocketHandle; inStr := Socket.ReceiveText; Memo2.Lines.Add(inStr); for i := 0 to ssDummy.Socket.ActiveConnections - 1 do if Con = ssDummy.Socket.Connections[i].SocketHandle then ssDummy.Socket.Connections[i].SendText(inStr); end;
procedure TForm1.Button1Click(Sender: TObject); var i : integer; cs : TClientSocket; begin for i := 0 to ComponentCount-1 do begin if (Components[i] is TClientSocket) then if not (Components[i] as TClientSocket).Active then (Components[i] as TClientSocket).Free; end; end;
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.