Chatprogram der også skal kunne sende filer, client /server style
Er ved at lave et program der skal kunne sende/modtage filer/kommandoer med henblik på at chatte.Disse kommandoer ville så være for at fx fortælle serveren at teksten skal vises med grøn kursiv skrift eller noget i den retning.
Her er lidt om opbygningen:
Jeg bruger port 1111 og 2222 (kan self ændres *GG*) til hhv kommandoer og filer, således det er lettere at overskue. Men hvis der er nogen der har et forslag hvor det kan komme til at køre over samme port, så er i velkomne til at sige det.
Har indtil videre præsteret at frembringe følgende kode, som, efter min bedste overbevisning!!!, burde virke..... men det gør det ikke :-/
Selve sende og modtage delen for filer, er jeg ikke kommet til endnu, da jeg vil have det her til at virke først.... Men igen er i velkomne til at komme med et forslag til hvordan dette løses...
Håber der er nogen der kan hjælpe mig
Først server-delen
************ Main.pas (Serverpart) **************************
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets;
type
TForm1 = class(TForm)
tcpCmdClient: TTcpClient;
tcpCmdServer: TTcpServer;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure tcpCmdServerAccept(Sender: TObject; ClientSocket: TCustomIpClient);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Commands;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
tcpCmdServer.LocalPort := '1111';
tcpCmdServer.Open;
tcpCmdServer.Active := True; // er denne linie nødvendig?????
tcpCmdClient.RemotePort := '1111';
end;
function GetCmd(aTmp: string): string; // her findes selve kommandoen i den modtagne streng (fra første tegn til første mellemrum)
var
I: Integer;
tmpRes: string;
begin
I := 1;
while (aTmp[I] <> ' ') and (I < Length(aTmp)) do Inc(I);
tmpRes := Copy(aTmp,1,I);
Result := Trim(tmpRes);
end;
function GetCmdText(aTmp: string): string; // her findes teksten der er sendt afsted fra Client
var
I: Integer;
tmpRes: string;
begin
I := 1;
while (aTmp[I] <> ' ') and (I < Length(aTmp)) do Inc(I);
tmpRes := Copy(aTmp,I,Length(aTmp)-I+1);
Result := Trim(tmpRes);
end;
procedure TForm1.tcpCmdServerAccept(Sender: TObject; ClientSocket: TCustomIpClient); // denne procedure køres hver gang Server modtager data fra Client
var
aTmp,aCmd,aText: string;
begin
if not tcpCmdClient.Connected then
begin
tcpCmdClient.RemoteHost := tcpCmdServer.RemoteHost;
tcpCmdClient.Open;
end;
aTmp := ClientSocket.Receiveln; // modtag tekststreng og placer denne i aTmp
aCmd := GetCmd(aTmp); // isoler kommando
aText := GetCmdText(aTmp); // isoler selve teksten
// kør kommandoerne
if aCmd = 'blue' then SetTextBlue(aText) else
if aCmd = 'exit' then DisconnectExit else
AReturn('"' + aTmp + '" is not a valid command!');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
tcpCmdClient.Close;
tcpCmdServer.Close;
end;
end.
******************************************************
.... og her følger så Clientdelen
****************Main.pas (Client)*******************
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FileCtrl, Sockets, ComCtrls;
type
TfrmMain = class(TForm)
cmdConnect: TButton;
cmdDisconnect: TButton;
tcpCmdServer: TTcpServer;
tcpCmdClient: TTcpClient;
Edit1: TEdit;
Chat: TRichEdit;
procedure cmdConnectClick(Sender: TObject);
procedure cmdDisconnectClick(Sender: TObject);
procedure tcpCmdServerAccept(Sender: TObject; ClientSocket: TCustomIpClient);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
uses commands;
procedure TfrmMain.cmdConnectClick(Sender: TObject);
var
Remotehost: string;
begin
Remotehost := InputBox('Connect to remote computer','Enter ip or name','');
tcpCmdClient.RemoteHost := Remotehost;
tcpCmdClient.RemotePort := '1111';
tcpCmdClient.Open;
if not tcpCmdClient.Connected then showmessage('error connecting!!');
tcpCmdServer.LocalPort := '1111';
tcpCmdServer.Open;
end;
procedure TfrmMain.cmdDisconnectClick(Sender: TObject);
begin
tcpCmdClient.Close;
tcpCmdServer.Close;
end;
procedure TfrmMain.tcpCmdServerAccept(Sender: TObject; ClientSocket: TCustomIpClient);
var
aText: string;
begin
aText := ClientSocket.Receiveln;
Chat.Lines.Add(aText);
end;
end.
*********************************************