Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Einfaches Client - Socket Gespräch


Robii - Fr 18.12.09 01:32
Titel: Einfaches Client - Socket Gespräch
Gute Mitternacht, ich habe ein Programm geschrieben, indem ein SocketServer online geht und auf neue Verbindungen wartet.
Wenn er eine neue Verbindung bekommt, so kann man per EditFeld nachrichten an diesen Client schicken. Wenn ich jetzt mit meinem Client connecte, wird mir bei meinem Server eine Neue Verbindung + Ip-Adresse angezeigt. Möchte ich jetzt aber eine Nachricht verschicken, kommt eine Fehlermeldung, das keine Verbindung existiert. Mir aus unerklärlichen Gründen, beendet der Server immer die Verbindung oder es kommt garnicht zu einer vollkommenen Verbindung, den die Nachricht 'Neue Verbindung. (IP-ADRESSE)' lasse ich anzeigen bei dem OnConnect-Ereigniss des Servers. Wisst ihr wieso? Hier noch die Soucre vom Client und vom Server.

CLIENT

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm2.bConClick(Sender: TObject);
begin
Client.Open;
end;

procedure TForm2.bSendClick(Sender: TObject);
begin
Client.Socket.SendText(eClient.Text);
end;

procedure TForm2.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
ClientLog.Lines.Add(Socket.ReceiveText);



SERVER

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm2.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.Lines.Add('Neue Verbindung. ('+Socket.RemoteAddress+')');
end;

procedure TForm2.bSendClick(Sender: TObject);
begin
  Log.Lines.Add(eCmd.Text);
  Server.Socket.SendText('#'+eCmd.Text+'#');
end;

procedure TForm2.ServerClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Log.Lines.Add('Verbindung verloren ('+Socket.RemoteAddress+')');
  lVic.Caption:='Keine';
  SetzePosition(0);
end;


Ich hoffe ihr könnt mir helfen, habe jetzt nicht den gesamten Quellcode vom Server reingeschrieben, das Programm hat ja auch noch andere Funktionen.

Lieben Gruß & gute Nacht.


Niko S. - Fr 18.12.09 07:19

So wie ich das sehe, musst du wenn du nachrichten schickst vom Server zu Client, den eindeutig Identifizieren.
Beispielsweise wäre:

Delphi-Quelltext
1:
ServerSocket.Socket[0].SendText('Text');                    

Der erste Client der sich verbunden hat.

//Edit:
Ja natürlich, vollkommen vergessen.. Man packt normalerweise die Sockets wo anders rein ;x
Narses hat recht (warum auch nicht ,er ist immerhin der Netzwerkexperte =D)


Narses - Fr 18.12.09 11:29

Moin!

Die Vermutung meines Vorredners ist richtig, der Code leider nicht. Der ServerSocket ist selbst nicht zum Versenden geeignet (der ist nur zum Annehmen der Verbindungen da), sondern die bereits etablierten Verbindungen im .Connections[]-Array. :idea: Siehe dazu auch den entsprechenden FAQ-Beitrag [http://www.delphi-library.de/topic_die+Clients+von+TServerSocket+auseinanderhalten_47183.html]. :think: ;)

Hier gibt´s ein einfachs Chat-Tutorial zum Einsteigen [http://www.delphi-library.de/topic_Minimaler+LANInternetChat+mit+TServerTClientSocket_60744.html], hier geht´s weiter, wenn du mehr als Text versenden willst [http://www.delphi-library.de/topic_TerminatorzeichenProtokollTutorial++1+Sockets+v400_54269.html]. :les:

cu
Narses


Robii - Fr 18.12.09 13:05

Hey Dankeschön, ich hab nochmal in das Tutorial geguckt. Klappt jetzt. Ich hab da aber noch eine Frage. Und zwar habe ich gegoogelt, weil ich mit meinem Programm auch Dateien übertragen möchte und habe folgenden Lösungsvorschlag gefunden:

Man erstellt zwei Server, einen normalen Server, über den der Client mit dem Server kommuniziert und einene FileServer, den man 'einschaltet', wenn man eine Datei übertragen kann. Dann kann man auf diesem FileServer den BinärCode der Datei an den Client schicken und dieser Empfängt auf seinem FileClient die Daten.

Nach der vollständigen Übertragung, wird der FileServer wieder ausgeschaltet und erst wieder eingeschaltet, wenn man wieder eine Datei übertragen möchte.

Vorteile sind angeblich, das man nicht den 'Kanal' vom HauptServer stört.

Kann mir jemand evtl. diese Variante etwas erläutern?
In was für einem Code muss ich die Datei den vom FileServer zum FileClient verschicken?
Und wie wandel ich die Datei um in den Code oder zurück in die Datei?

Lieben Gruß.


Narses - Sa 19.12.09 00:30

Moin!

Du könnest das z.B. per FTP machen. :idea: Gibt aber evtl. Probleme mit Routern. :nixweiss: Ist insgesamt aber auch kein einfaches Thema und schon gar nicht für den Einstieg... :?

cu
Narses


Robii - Sa 19.12.09 01:13

Abend.

Aber irgendwann muss ich mich ja mal mit der Dateiübertragung beschäftigen.
Zitat:
gar nicht für den Einstieg


Deswegen würde ich mich freuen, wenn ihr mir da helfen könnt oder Links zu Tutorials schicken könntet.

Lieben Gruß.

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Narses - So 20.12.09 01:25

Moin!

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
oder Links zu Tutorials schicken könntet.
Bittesehr: *Klick* [http://www.delphi-library.de/topic_BinaerProtokollTutorial+Sockets+v100+MalChatFiles_66706.html] :nixweiss:

cu
Narses