Entwickler-Ecke
Internet / Netzwerk - Chat-Client von 2.Rechner kein Connect auf Chat-Server
Kri - Di 08.04.08 11:52
Titel: Chat-Client von 2.Rechner kein Connect auf Chat-Server
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 - 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 - 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 - 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 - 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 - Di 08.04.08 12:30
Source des Clients:
Delphi-Quelltext
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:
Delphi-Quelltext
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 - Di 08.04.08 22:19
Weiss keiner Rat?
Xentar - Di 08.04.08 22:45
Sind vielleicht die Ports vom 2. und 3. Client von einer Firewall blockiert?
Wozu überhaupt mehrere Clients?
Kri - 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 - 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 - 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 - Do 17.04.08 14:31
Titel: Re: Chat-Client von 2.Rechner kein Connect auf Chat-Server
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 [
http://www.delphi-library.de/topic_TerminatorzeichenProtokollTutorial_54269.html] 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)? :gruebel:
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 [
http://www.delphi-forum.de/topic_TNBFPA+v111++SocketKompos+mit+Protokollfunktionen_71223.html]. Allerdings, ehrlich gesagt, ohne deinen Quelltext ziemlich viel zu ändern, wird das auch nicht sauber laufen, egal welche Komponenten zu dafür nimmst. :nixweiss:
cu
Narses
Kri - 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 - Sa 31.05.08 12:04
Ich habe es jetzt doch über eine Komponente hinbekommen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!