Autor Beitrag
Kri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: Di 08.04.08 12:30 
Source des Clients:
ausblenden volle Höhe 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:
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: Di 08.04.08 22:19 
Weiss keiner Rat?
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 08.04.08 22:45 
Sind vielleicht die Ports vom 2. und 3. Client von einer Firewall blockiert?
Wozu überhaupt mehrere Clients?
Kri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 17.04.08 14:31 
Moin!

user profile iconKri 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?

user profile iconKri 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?

user profile iconKri hat folgendes geschrieben:
ausblenden 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?

user profile iconKri 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:

user profile iconKri 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.
user profile iconXentar 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.
user profile iconKri 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. ;)

user profile iconKri 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. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Kri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 118



BeitragVerfasst: Sa 31.05.08 12:04 
Ich habe es jetzt doch über eine Komponente hinbekommen.