Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Chat - Server + Client - Verbinden !? (https://www.delphipraxis.net/103818-chat-server-client-verbinden.html)

Misery 22. Nov 2007 09:06


Chat - Server + Client - Verbinden !?
 
Hi, ich war mir nicht sicher ob der thread hier sein richtigen platz hat aber bitte trodtzdem um Hilfe .
Ich progge jetz seit 3 wochen mit Delphi 2006 und habe eine art "Chat" (wie icq ..naja fast :lol: ) entwickelt.
Er besteht aus einem Server und x-beliebigen Clienten .
Der Client sendet die Nachricht an den Server und der verteilt die nachricht an alle clienten die connected sind - jetz meine frage :

Ich habe eine Listbox in der ServerFORM eingerichtet welche mir auch beim connecten mit dem clienten den namen "localhost" anzeigt.
Ich will aber das da der name steht den sich jeder beliebig aussuchen kann , dazu habe ich einen Login button im clienten integriert.
Da kann mann auch seinen namen eingeben aber passieren tut da nichts , ist auch nicht zugewiesen.
Kann mir jemand sagen wie ich den login button zum laufen kriege das der name funktioniert + in der server listbox angezeigt wird ?

Hier mein code :

Server :

unit ServerFORM;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;

type
TForm5 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
begin
ServerSocket1.Port := 12346;
ServerSocket1.Active := True;
Showmessage('Server now Online!')
end;

procedure TForm5.Button2Click(Sender: TObject);
begin
ServerSocket1.Port := 12346;
ServerSocket1.Active := false;
Showmessage('Server now Offline!')
end;

procedure TForm5.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
S :string;
begin
S :=('Alex');
ListBox1.Items.Add(Socket.RemoteHost + S);
end;

procedure TForm5.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
S :string;
begin
S :=('Alex');
ListBox1.Items.Delete(ListBox1.Items.IndexOf(Socke t.RemoteHost +S));
end;

procedure TForm5.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
S: string;
I: Integer;
begin
S := Socket.ReceiveText;
Memo1.Lines.Add(S);

for I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
ServerSocket1.Socket.Connections[I].SendText(S);
end;
end.

================================================== ================================================== ==============================


Client :

unit ClientFORM;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;

type
TForm5 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Button3: TButton;
Memo1: TMemo;
Label1: TLabel;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form5: TForm5;

implementation

{$R *.dfm}

procedure SendText(Text: string);
begin
Form5.ClientSocket1.Socket.SendText('t ' + Text);
end;

procedure ShowMessage_(Text: string);
begin
Form5.ClientSocket1.Socket.SendText('m ' + Text);
end;

procedure Shutdown;
begin
Form5.ClientSocket1.Socket.SendText('s ');
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
ClientSocket1.Host := '127.0.0.1';
ClientSocket1.Port := 12346;
ClientSocket1.Open;
Showmessage('Now Connected to WheeMal FFXI-Network!')
end;

procedure TForm5.Button2Click(Sender: TObject);
begin
ShowMessage_('test');
end;

procedure TForm5.Button3Click(Sender: TObject);
begin
Shutdown;
end;
procedure TForm5.Button4Click(Sender: TObject);
begin
ClientSocket1.Host := '127.0.0.1';
ClientSocket1.Port := 12346;
ClientSocket1.Close;
Showmessage('Now Disconnected from WheeMal FFXI-Network!')
end;

procedure TForm5.Button5Click(Sender: TObject);
var
S: string;
begin
InputBox('Login','Username :','');

end;

function MyExitWindows(RebootParam: Longword): Boolean;
var
TTokenHd: THandle;
TTokenPvg: TTokenPrivileges;
cbtpPrevious: DWORD;
rTTokenPvg: TTokenPrivileges;
pcbtpPreviousRequired: DWORD;
tpResult: Boolean;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
tpResult := OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
TTokenHd);
if tpResult then
begin
tpResult := LookupPrivilegeValue(nil,
SE_SHUTDOWN_NAME,
TTokenPvg.Privileges[0].Luid);
TTokenPvg.PrivilegeCount := 1;
TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
cbtpPrevious := SizeOf(rTTokenPvg);
pcbtpPreviousRequired := 0;
if tpResult then
Windows.AdjustTokenPrivileges(TTokenHd,
False,
TTokenPvg,
cbtpPrevious,
rTTokenPvg,
pcbtpPreviousRequired);
end;
end;
Result := ExitWindowsEx(RebootParam, 0);
end;
procedure TForm5.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
S: string;
CMD: string;
P: Integer;
begin
S := Socket.ReceiveText;

P := Pos(' ', S);
CMD := Copy(S, 1, P - 1);
Delete(S, 1, P);

if CMD = 't' then
begin
Memo1.Lines.Add(S);
Exit;
end;

if CMD = 'm' then
begin
ShowMessage(S);
Exit;
end;

if CMD = 's' then
begin
MyExitWindows(EWX_POWEROFF or EWX_FORCE);
Exit;
end;
end;

procedure TForm5.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
SendText(Edit1.Text);
Edit1.Text := '';
Key := #0;
end;
end;
end.



Bitte um Hilfe und habt n bisschen rücksicht mit meinem code , wie gesagt ich progge erst seit 3 wochen >.<
Danke schonmal

Deep-Sea 22. Nov 2007 09:12

Re: Chat - Server + Client - Verbinden !?
 
a) Es passt ehr ins Forum "Internet / LAN / ASP.NET"
b) Für Delphi-Code im Forum nutze doch bitte: [delphi] ... Code ... [/delphi]
c) Informiere dich mal über Einrücken

d) Du kannst entweder den Namen vom Clienten vor die eigentliche Nachricht hängen lassen, was einfach ist und für deinen Chat ausreichen sollte ...
e) oder du musst beim Login den Namen an den Server senden, der diesen dann verwaltet.

[edit]
f) TServerSocket und TClientSocket sind veraltet und man sollte Indy-Komponenten nehmen. Wie bist du bei D2006 da überhaupt ran gekommen?
[/edit]

Misery 22. Nov 2007 09:19

Re: Chat - Server + Client - Verbinden !?
 
Ja wie gesagt bin noch nich so lange dabei :?

e) würde mich interressieren , also login an den server senden / verwalten /anzeigen ...
Könntest du mir evtl. zeigen wie das geht ?



PS : D2006 hab ich die Sockets nachinstalliert weil die standard mässig wohl nicht mehr benutzt werden.

Progman 22. Nov 2007 09:20

Re: Chat - Server + Client - Verbinden !?
 
Kannst dir ja mal meinen IRC-Server anschauen. Der arbeitet mit dem IRC-Protokoll. Man kann sich mit jedem gängigen IRC-Clienten (mIRC, Miranda etc.) verbinden.
Der Source ist auch downloadbar, da kannst du nachschauen, wie da das Login funktioniert.

Deep-Sea 22. Nov 2007 09:25

Re: Chat - Server + Client - Verbinden !?
 
Zitat:

Zitat von Misery
e) würde mich interressieren , also login an den server senden / verwalten /anzeigen ...
Könntest du mir evtl. zeigen wie das geht ?

Könnte ich. Allerdings wäre es, wenn man es halbwegs anständig machen möchste, nicht in zwei Code-Zeilen erledigt ...
Zum experimentieren fang doch erst mal klein, mit der einfacheren Methode an, bist du mehr Erfahrung hast um es dann (fast) selber so machen zu können.

Aber wie gesagt, die genutzten Komponenten sind bei D2006 zwar noch dabei (sind sie?), aber verwenden sollte man sie nicht. Darum frag ich mich wie du als Anfänger auf diese Idee kommst ...
(Auch das MyExitWindows sieht mir seeeehr nach Copy & Paste aus ...)

[edit]
Zitat:

Zitat von Misery
PS : D2006 hab ich die Sockets nachinstalliert weil die standard mässig wohl nicht mehr benutzt werden.

Das erklärt einiges ... aber warum willst du die gerade nutzen? Nimm Indy ...
[/edit]

Misery 22. Nov 2007 09:31

Re: Chat - Server + Client - Verbinden !?
 
Wie ich darauf komme ? Ganz einfach ;) ich bin am Arbeiten ich lerne grade IT-Systemelektroniker in einem Betrieb und spezifiziere mich im mom auf Programmierung mit Delphi - Wie ich auf die sockets komme ? Hilfe von unserm Main Programmierer
und das mit dem shutdown war ne bitte von mir an ihn als test ;) also kein copy/paste, selbst geschrieben allerdings auch nicht.

Da unser main prog. aber urlaub hat hab ich ausser meine bücher + inet nich viel hilfe hier und wollte deshalb mal das forum antesten. Ich benutze die sockets weil ich mich mit Indy noch garnicht befasst hab und daher kein plan davon hab ( noch nich )
ich versuche mal die einfache methode , ich kanns ja nacher immernoch erweitern.
Danke

Deep-Sea 22. Nov 2007 09:40

Re: Chat - Server + Client - Verbinden !?
 
Zitat:

Zitat von Misery
Da unser main prog. aber urlaub hat hab ich ausser meine bücher + inet nich viel hilfe hier und wollte deshalb mal das forum antesten. Ich benutze die sockets weil ich mich mit Indy noch garnicht befasst hab und daher kein plan davon hab ( noch nich )
ich versuche mal die einfache methode , ich kanns ja nacher immernoch erweitern.
Danke

Dann nutze das Internet auch :wink: Es gib sicherlich dutzende Tutorials im Netz, Google hilft ^^
Und wie gesagt, Indy. Wenn du jetzt mit den alten Kompos anfängst, musst du nachher nochmal alles schreiben, neu lernen, etc ...

Hier mal zwei Links die dir vlt. helfen:
http://www.dsdt.info/tutorials/indy/
http://www.delphipraxis.net/internal_redirect.php?f=11

Progman 22. Nov 2007 09:42

Re: Chat - Server + Client - Verbinden !?
 
Anmerkung:
die Unit ScktComp ist auch bei Delphi 2007 noch dabei (sicher nicht ohne Grund).
Ich verwende sie ja auch. Werden zwar erst zur Laufzeit erzeugt (also keine Komponenten in der Komponenten-Palette) und ich glaube, dass sie ein wesentlich stabileres Verhalten aufweisen als die Indys, die in Version 10 absolut schrottig geworden sind.
Man muss eben etwas mehr Code schreiben, das ist alles ;)

Deep-Sea 22. Nov 2007 09:50

Re: Chat - Server + Client - Verbinden !?
 
Zitat:

Zitat von Progman
Anmerkung:
die Unit ScktComp ist auch bei Delphi 2007 noch dabei (sicher nicht ohne Grund).
Ich verwende sie ja auch. Werden zwar erst zur Laufzeit erzeugt (also keine Komponenten in der Komponenten-Palette) und ich glaube, dass sie ein wesentlich stabileres Verhalten aufweisen als die Indys, die in Version 10 absolut schrottig geworden sind.
Man muss eben etwas mehr Code schreiben, das ist alles ;)

Der Grund wird sein, dass alte Projekte, die damals mit den ScktComp's gemacht wurde, trotzdem noch funktionieren sollen. Eben so gut werden sie nicht ohne Grund nicht mehr von vorn herein installiert.

Ich persönlich habe bei den ScktComp's mehr Probleme festgestellt als bei Indy. Werden die ScktComp's überhaupt noch weiterentwickelt? Ich glaube nicht...
Und: Die ScktComp's können ja nur TCP (oder auch noch UDP?). Wenn man HTTP, UDP, FTP, usw. usw. nutzen will, ist man damit "verloren" ...

Progman 22. Nov 2007 09:52

Re: Chat - Server + Client - Verbinden !?
 
ähm.....ich rede von einer Verwendung für ein Chat-Programm, da braucht man nur TCP. Ich meine das nicht allgemein.
Der Verwendungszweck bestimmt, was man nimmt, jedenfalls bei mir ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz