![]() |
Problem mit Server/Client funktioniert NUR lokal ?!
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 |
Re: Problem mit Server/Client funktioniert NUR lokal ?!
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.
|
Re: Problem mit Server/Client funktioniert NUR lokal ?!
hier der quelltext für meinen Client:
Code:
Hier der quelltext für meinen Server:
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.
Code:
Ich hoffe das es jetzt einfacher ist mir zu helfen
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. |
Re: Problem mit Server/Client funktioniert NUR lokal ?!
Klar, weil genau das gemacht wird, was ich Eingangs schon vermutet hatte. Zum Beispiel diese Methode:
Delphi-Quellcode:
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.
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; 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. |
Re: Problem mit Server/Client funktioniert NUR lokal ?!
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. |
Re: Problem mit Server/Client funktioniert NUR lokal ?!
Oh, Danke Muetze1!
Dieses Problem habe ich schon so lange! :thumb: So eine super Erklärung, hab ich trotz intensiver Internetsuche, nicht gefunden. mfg, Dj_Base |
Re: Problem mit Server/Client funktioniert NUR lokal ?!
Zitat:
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz