AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit Server/Client funktioniert NUR lokal ?!
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Server/Client funktioniert NUR lokal ?!

Ein Thema von ghost007 · begonnen am 13. Jan 2006 · letzter Beitrag vom 27. Jun 2006
Antwort Antwort
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#1

Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 13. Jan 2006, 19:08
Hallo,
ich habe einen Chat Server und einen Chat Client geschrieben, in den Client muss man die IP des servers eingeben, und dnan funktioniert das auch ganz schön , aber leider nur in meinem LAN.
WEnn ich den server auf meinem PC starte und dann den Client uaf einem PC, meines Freundes starte, und connecten will, bekomme ich den fehler "Asynchronous socket error 10061".
Wie kann ich meinen Chat quasi "internet fähig" machen?

Vielen dank schon mal

P.S. Ich benutze Delphi 7
Christian
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 13. Jan 2006, 19:42
Klingt fast so, als wenn dein Chat nicht mit den Events/Ereignissen der Komponenten arbeitet sondern er direkt genutzt wird. So z.B. das direkte Versenden von Daten nach dem Open/Active := True; etc. Ich glaube du solltest mal ein wenig Quellcode von deinem Projekt hier zeigen, wie du den Socket aktivierst und mit ihm arbeitest.
  Mit Zitat antworten Zitat
Benutzerbild von ghost007
ghost007

Registriert seit: 31. Okt 2005
Ort: München
1.024 Beiträge
 
Delphi 7 Personal
 
#3

Re: Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 13. Jan 2006, 20:04
hier der quelltext für meinen Client:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdIPWatch, ExtCtrls,
  ScktComp, XPMan;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ClientSocket1: TClientSocket;
    Timer1: TTimer;
    IdIPWatch1: TIdIPWatch;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Delay(time: word);
    procedure Button3Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Nickname: String;
  Nachricht:string;

implementation

{$R *.dfm}

procedure TForm1.Delay(time:word);
var Start: Integer;
begin
  Start:= GetTickCount;
  while (GetTickCount)-(Start) <= time do
     Application.ProcessMessages;
end;    

procedure TForm1.FormCreate(Sender: TObject);
begin
Label3.Caption:=IdIPWatch1.LocalIP;
Button3.Enabled:=false;
Button2.Enabled:=false;
Memo1.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Nickname:=Edit3.Text;
Button1.Enabled:=false;
Edit3.Enabled:=false;
Button2.Enabled:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit2.Text;
ClientSocket1.Port:=7530;
ClientSocket1.Active:=true;
Button2.Enabled:=false;
Edit2.Enabled:=false;
Button3.Enabled:=true;
Nachricht:=Edit3.Text+' hat den Raum betreten';
delay(500);
ClientSocket1.Socket.SendText(Nachricht);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if (ClientSocket1.Active=true) and (Edit1.Text<>'') then
ClientSocket1.Socket.SendText(Nickname+': '+Edit1.Text);
Edit1.Text:='';
Memo1.Perform(WM_VSCROLL,SB_BOTTOM,0);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Form1.Show;
Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label3.Caption:=IdIPWatch1.LocalIP;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Socket.SendText(Edit3.Text +' hat den Chat verlassen.');
delay(500);
ClientSocket1.Close;
end;

end.
Hier der quelltext für meinen Server:
Code:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    IdIPWatch1: TIdIPWatch;
    Memo1: TMemo;
    ServerSocket1: TServerSocket;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Label2.Caption:=IDIPWatch1.LocalIP;
ServerSocket1.Port:=7530;
ServerSocket1.Active:=true;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Text:=Socket.ReceiveText;
Memo1.Lines.Add(TimeToStr(now)+': '+Text);
    For I:=0 to ServerSocket1.Socket.ActiveConnections - 1 do
     begin
     with ServerSocket1.Socket.Connections [I] do
    if (Connected) then SendText(Text);
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
Memo1.Lines.SaveToFile('C:/Chat-Log.txt');
end;

end.
Ich hoffe das es jetzt einfacher ist mir zu helfen
Christian
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 13. Jan 2006, 20:57
Klar, weil genau das gemacht wird, was ich Eingangs schon vermutet hatte. Zum Beispiel diese Methode:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientSocket1.Host:=Edit2.Text;
  ClientSocket1.Port:=7530;
  ClientSocket1.Active:=true;
  Button2.Enabled:=false;
  Edit2.Enabled:=false;
  Button3.Enabled:=true;
  Nachricht:=Edit3.Text+' hat den Raum betreten';
  delay(500);
  ClientSocket1.Socket.SendText(Nachricht);
end;
Die ganzen Socketgeschichten laufen asynchron ab, d.h. du kannst nicht einfach den Socket verbinden lassen (Active := True) und dann einfach ihm 500 Millisekunden Zeit geben und dann eine Nachricht senden. Der Socket kann sonst wie lange brauchen bis er verbunden ist. Du hast doch bestimmt auch schon öfters mal im Internet Server gehabt, die eine Ewigkeit gebraucht haben, bis der Download angefangen hatte. Nun stell dir mal vor, dein Browser würde nach dem anklicken auch nur 500 Millisekunden warten, bis die Datei anfängt zu laden.
Wenn du dem Socket nun sagst, er soll anfangen eine Verbindung aufzubauen (mit Active := True), dann braucht er eine undefinierte Zeit dafür. Daher kannst du die Aktionen mit dem Senden erst machen, wenn der Socket die Verbindung aufgebaut hat und diese steht. Daher kannst du das Socket.SendText() erst machen, wenn du weisst, dass die Verbindung steht. Und wenn der Socket diese Verbindung aufgebaut hat, dann gibt er dir Bescheid und ruft das Ereignis OnConnect auf. In diesem Ereignis kannst du zum ersten Mal Daten senden, weil ab dem Zeitpunkt wo dieses Ereignis ausgelöst wird, die Verbindung steht.

Grundlegend klappt es im LAN, da dort die Reaktionszeit und die Wege sehr kurz, klein und schnell sind. Über das Internet ist es auf Grund der gesamten Topologie immer etwas Zeitaufwendiger, genauso wie in etwas grösseren LANs bzw. WANs, etc. Daher musst du immer auf Ereignisse reagieren und nicht einfach immer nur drauf los arbeiten.
  Mit Zitat antworten Zitat
cyberkiller0072001

Registriert seit: 5. Jan 2004
Ort: Netz
68 Beiträge
 
Delphi 5 Professional
 
#5

Re: Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 26. Jun 2006, 18:51
Ich habe dasselbe Problem, allerdings schon beim verbinden.
Wenn ich im LAN verbinde, wird das Ereignis "OnConnect" ausgeführt.
Im Internet jedoch kommt nach einer Weile mal Socket Error 10061, mal 10060.
Das Programm war nur zum testen gedacht. Jeweils eines Führt Typ A aus und das andere Typ B:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Case Radiogroup1.itemindex of
0: begin
    serversocket1.port:=1011;
    clientsocket1.Port:=1010;
   end;
1: begin
    serversocket1.port:=1010;
    clientsocket1.port:=1011;
   end;
end;
clientsocket1.host:=edit1.text;
serversocket1.Active:=true;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Clientsocket1.active:=true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Showmessage('Clientconnect');
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
showmessage('Server connect');
end;

end.
Er würgte eine Klapperschlang' bis das ihr Klappern schlapper klang
  Mit Zitat antworten Zitat
Benutzerbild von Dj_Base
Dj_Base

Registriert seit: 10. Aug 2004
Ort: Aachen
231 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 26. Jun 2006, 18:57
Oh, Danke Muetze1!

Dieses Problem habe ich schon so lange!

So eine super Erklärung, hab ich trotz intensiver Internetsuche, nicht gefunden.

mfg,

Dj_Base
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Problem mit Server/Client funktioniert NUR lokal ?!

  Alt 27. Jun 2006, 09:14
Zitat von cyberkiller0072001:
Ich habe dasselbe Problem, allerdings schon beim verbinden.
Wenn ich im LAN verbinde, wird das Ereignis "OnConnect" ausgeführt.
Im Internet jedoch kommt nach einer Weile mal Socket Error 10061, mal 10060.
10060: WSAETIMEDOUT - Verbindungspartner hat nicht in der angegeben Zeit reagiert, daher TimeOut.
10061: WSAECONNREFUSED - Verbindung abgewiesen. Der Partner hat die Verbindung abgelehnt.

Mit anderen Worten: Deine Netzwerk/Interneteinstellungen stimmen nicht. Hängt derjenige zu dem du verbinden willst direkt im Internet (a) oder über einen Router (b)?

a) Ist seine Firewall so konfiguriert, dass sie den benutzten Port durchlässt von aussen?
b) Ist der Port im Router weitergeleitet an den Rechner im LAN auf dem das passende Gegenstück zu deinem Programm läuft?

Grundlegend kann hier keine Verbindung aufgebaut werden, da die Kommunikation nicht ordentlich zum Ziel gelangen kann. Daher mal den Weg/Routing der Daten überprüfen, ob auch alle Voraussetzungen getroffen wurden.

Zitat von Dj_Base:
Dieses Problem habe ich schon so lange!
So eine super Erklärung, hab ich trotz intensiver Internetsuche, nicht gefunden.
Kein Problem, aber hast du denn deine Probleme lösen können oder bestehen sie weiterhin aber du weisst nun immerhin warum? Das konnte ich nicht so ganz rauslesen...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr.
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