Avatar billede djones Nybegynder
10. december 2004 - 15:05 Der er 2 kommentarer

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.

*********************************************
Avatar billede chrillemat Nybegynder
10. december 2004 - 16:47 #1
løsninen er pi!
Avatar billede djones Nybegynder
20. december 2004 - 13:42 #2
er der ikke nogen der har et bedre forslag end chrillemat?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester