| Autor |
Beitrag |
Kri
      
Beiträge: 118
|
Verfasst: Di 08.04.08 11:52
Hallo zusammen,
ich bin nun soweit fertig mit der programmierung meines Chats (mit der TServerSocket und der TClientSocket).
Der Chat-Server liegt auf meinem eigenen Homeserver, welcher über eine dynamische DNS erreichbar ist.
Beim Host des Chat-Clients ist meine DynDNS eingetragen, und die benötigten Ports sind weitergeleitet.
Nun zu meinem Problem:
Ich starte den Server.. Wenn ich nun den Chat-Client auf meinem Homeserver starte (wo auch mein Chat-Server gestartet ist), läuft alles wunderbar, ich kann connecten, und schreiben..
Wenn ich nun aber den Client von meinem 2. Rechner aus starte, kann ich meist nicht connecten, seltenerweise funktioniert das, aber schreiben kann ich nichts..
Ich denke dass liegt daran dass der Timeout zu niedrig ist, aber es kann auch etwas anderes sein, ich bin ratlos..
Ich hoffe ihr könnt mir helfen..
Viele liebe Grüße
Kri
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 08.04.08 11:57
Befindet sich der 2. Rechner, von dem aus du probierst, im selben Netzwerk, oder versuchst du es direkt über Internet?
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Di 08.04.08 12:01
Also die beiden Rechner hängen an einem Router, der Chat läuft aber übers Internet (durch die DynDNS) und nicht über LAN.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.04.08 12:11
1. Kannst du mal die Internet-IP des Routers ausprobieren statt der DynDNS-Adresse um sicherzugehen, dass es kein DNS-Problem ist.
2. Welcher Fehler kommt denn beim Verbinden?
Ohne ein wenig Quelltext oder zumindest der Fehlermeldung kann man da nicht viel dazu sagen. Es gibt einfach sehr viele mögliche Ursachen, die man aber ohne den Quelltext oder die Möglichkeit es auszuprobieren schlecht finden kann.
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Di 08.04.08 12:21
Also ein DNS Prob ist es nicht, mein TS-Server, mein HTTP-Server und mein FTP-Server laufen über DynDNS und sind erreichbar..
Habe eben nochmal beides gestarten es ist folgendermaßen:
Wenn ich versuchen will zu connecten, funktioniert das auch einigermaßen:
Mein Server zeigt mir an, dass eine IP connectet hat.
Aber sobald ich versuche etwas zu schicken, kommt die Meldung des Clients "Not Connected"!
Ich suche mir mal ein paar Quelltext Zeilen raus und poste die..
Grüße
Kri
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Di 08.04.08 12:30
Source des Clients:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143:
| var Nickname:string; var mz:integer; procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption:='NTQ-Client'; Application.Title:=Form1.Caption; Form1.BorderStyle:=bsSingle; Form1.Position:=poScreenCenter;
ClientSocket1.Port:=7530; ClientSocket2.Port:=7531; ClientSocket3.Port:=7532; Memo1.Clear; Memo2.Clear; Memo3.Clear;
Label2.Caption:='..not connected..' end;
procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket1.Host:=('ntq.dontexist.com'); ClientSocket2.Host:=('ntq.dontexist.com'); ClientSocket3.Host:=('ntq.dontexist.com');
ClientSocket1.Active:=true; ClientSocket2.Active:=true; ClientSocket3.Active:=true; end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Clear; Nickname:=Edit1.Text; Label2.Caption:=('..connected to NTQ..'); ClientSocket1.Socket.SendText(Nickname+' connected..'); end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add('..disconnected from NTQ..'); ClientSocket1.Socket.SendText(Nickname+' disconnected..'); Label2.Caption:=('..disconnected from NTQ..'); end;
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Memo1.Lines.Add('Fehler '+IntToStr(ErrorCode)); ClientSocket1.Active:=false; ClientSocket2.Active:=false; ClientSocket3.Active:=false; ErrorCode:=0; end;
procedure TForm1.Button2Click(Sender: TObject); var z:integer; begin if (ClientSocket2.Active) then begin ClientSocket2.Socket.SendText(Nickname);
if mz>0 then begin for z:=0 to mz do begin sleep(50); ClientSocket2.Socket.SendText(' '); end; end; ClientSocket3.Socket.SendText(Memo3.Text); end else Memo1.Lines.Add('Nicht verbunden!');
Memo3.Clear; end;
procedure TForm1.FormDestroy(Sender: TObject); begin if (ClientSocket1.Active) then ClientSocket1.Close; end;
procedure TForm1.ClientSocket2Read(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add(Socket.ReceiveText); end;
procedure TForm1.ClientSocket3Read(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add(Socket.ReceiveText); end;
procedure TForm1.ClientSocket2Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode:=0; end;
procedure TForm1.ClientSocket3Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode:=0; end;
procedure TForm1.Memo3Change(Sender: TObject); begin mz:=Memo3.Lines.Count-1; end;
procedure TForm1.ClientSocket2Connect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket2.Socket.SendText(Nickname); end;
procedure TForm1.ClientSocket3Connect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket3.Socket.SendText('connected..'); end;
procedure TForm1.ClientSocket2Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket2.Socket.SendText(Nickname); end;
procedure TForm1.ClientSocket3Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket3.Socket.SendText('disconnected..'); end;
end. |
Source des Servers:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption:='NTQ-Server'; Application.Title:=Form1.Caption; Form1.BorderStyle:=bsSingle; Form1.Position:=poScreenCenter;
Memo1.Clear; Memo2.Clear; Memo3.Clear;
ServerSocket1.Port:=7530; ServerSocket1.Open; ServerSocket2.Port:=7531; ServerSocket2.Open; ServerSocket3.Port:=7532; ServerSocket3.Open; Memo1.Lines.Add('Server online.'); Memo1.Lines.Add(''); end;
procedure TForm1.FormDestroy(Sender: TObject); begin ServerSocket1.Close; ServerSocket2.Close; ServerSocket3.Close; end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var MyMessage:String; i:Integer; begin MyMessage:=Socket.ReceiveText;
Memo1.Lines.Add(MyMessage); Memo1.Lines.Add(Socket.RemoteAddress); Memo1.Lines.Add(DateToStr(now)); Memo1.Lines.Add(TimeToStr(now)); Memo1.Lines.Add('');
end;
procedure TForm1.ServerSocket2ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Nickname:String; i:Integer; begin Nickname:=Socket.ReceiveText;
Memo2.Lines.Add(Nickname);
for i := 0 to ServerSocket2.Socket.ActiveConnections-1 do ServerSocket2.Socket.Connections[i].SendText(Nickname); end;
procedure TForm1.ServerSocket3ClientRead(Sender: TObject; Socket: TCustomWinSocket); var MyMessage:String; i:Integer; begin MyMessage:=Socket.ReceiveText;
Memo3.Lines.Add(MyMessage);
for i := 0 to ServerSocket3.Socket.ActiveConnections-1 do ServerSocket3.Socket.Connections[i].SendText(MyMessage); end;
end. |
Habe jetzt noch was weiteres herrausgefunden:
Der erste Client schafft es zu connecten, der 2. und der 3. nicht (Fehler 10061).
Viele liebe Grüße
Kri
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Di 08.04.08 22:19
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 08.04.08 22:45
Sind vielleicht die Ports vom 2. und 3. Client von einer Firewall blockiert?
Wozu überhaupt mehrere Clients?
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Di 08.04.08 22:50
Nein nein ich dass ist ausgeschlossen..
Der Text von 2. und 3. Client wird noch an den Server gesendet, aber ich bekomme nur den Fehler zurück..
Habe 3 Clients weil (wie man im Quelltext sieht) einen für Hinweise, einen für Nickname und einen für die Message..
Grüße
Kri
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 08.04.08 23:14
Ja, aber dazu braucht man doch keine 3?
Denk dir ein Protokoll aus, und reduzier das auf eine Verbindung, vielleicht gehts dann besser.
Kenn mich mit den normalen Sockets nicht aus, deswegen kann ich da keine großen Tipps geben. Evtl. noch eine andere Komponente (Indy).
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Mi 09.04.08 14:55
Hi,
sicherlich ist es einfacher wenn ich nur einen Socket benutze, dann ist es mir aber nicht möglich den Chat so aufzubauen wie ich mir das vorstelle..
Gibt es denn einen guten Ersatz für die TClientSocket und die TServerSocket ohne den Quelltext komplett ändern zu müssen?
Viele liebe Grüße
Kri
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 17.04.08 14:31
Moin!
Kri hat folgendes geschrieben: | | Ich denke dass liegt daran dass der Timeout zu niedrig ist, |
Das glaube ich eigentlich nicht. Oder passiert das erst dann, wenn du einige Zeit lang nichts von den Clients aus gesendest hast?
Kri hat folgendes geschrieben: | | Also die beiden Rechner hängen an einem Router, der Chat läuft aber übers Internet (durch die DynDNS) und nicht über LAN. |
Es sind also zwei PC, die jeweils über einen Router am Internet hängen, richtig?
Kri hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Button2Click(Sender: TObject); var z:integer; begin if (ClientSocket2.Active) then begin ClientSocket2.Socket.SendText(Nickname);
if mz>0 then begin for z:=0 to mz do begin sleep(50); ClientSocket2.Socket.SendText(' '); end; end; ClientSocket3.Socket.SendText(Memo3.Text); end else Memo1.Lines.Add('Nicht verbunden!');
Memo3.Clear; end; | |
Also, dieser Code sieht nicht wirklich gut aus...  Hast du dir schonmal dieses Tutorial angesehen?
Kri hat folgendes geschrieben: | | Der erste Client schafft es zu connecten, der 2. und der 3. nicht (Fehler 10061). |
Du hast bisher von 2 Rechnern gesprochen. Laufen diese Clients auf diesen beiden Rechnern oder sind doch noch andere (mit evtl. anderer Config im Spiel)?
Kri hat folgendes geschrieben: | | Habe 3 Clients weil (wie man im Quelltext sieht) einen für Hinweise, einen für Nickname und einen für die Message. |
Xentar hat folgendes geschrieben: | Ja, aber dazu braucht man doch keine 3?
Denk dir ein Protokoll aus, und reduzier das auf eine Verbindung, vielleicht gehts dann besser. |
Kri hat folgendes geschrieben: | | sicherlich ist es einfacher wenn ich nur einen Socket benutze, dann ist es mir aber nicht möglich den Chat so aufzubauen wie ich mir das vorstelle. |
Das halte ich aber doch für ein Gerücht.
Kri hat folgendes geschrieben: | | Gibt es denn einen guten Ersatz für die TClientSocket und die TServerSocket ohne den Quelltext komplett ändern zu müssen? |
Du könntest dir mal diese Komponenten ansehen. Allerdings, ehrlich gesagt, ohne deinen Quelltext ziemlich viel zu ändern, wird das auch nicht sauber laufen, egal welche Komponenten zu dafür nimmst.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Sa 19.04.08 11:33
Hi,
mein Laptop hat seinen Geist aufgeben, sprich ich hab im Moment kein Delphi und kann deine Vorschläge nicht in die Tat umsetzten..
Melde mich, wenn wieder alles im Lot ist..
Viele liebe Grüße
Kri
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Sa 31.05.08 12:04
Ich habe es jetzt doch über eine Komponente hinbekommen.
|
|