Entwickler-Ecke

Internet / Netzwerk - idTCPServer und Client - Problem


achterburg - Fr 03.10.03 02:35
Titel: idTCPServer und Client - Problem
Hallo,

ich habe ein aus der Schule programmiertes Nimmspiel um eine Netzwerkfunktion erweitert. Es funktioniert auch einigermaßen. Das Problem ist folgendes: Öfters bekomme ihc eine selbstprogrammierte Fehlermeldung, die nach einer Except Anweisung steht. Aßerdem stürzt das Programm jedesmal ab, wenn ich eine TCP Verbindung aufgebaut hab und es danach beende. Also irgendeinException Error.

Hier der Code vom TCP Server

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:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
VAR msg:string; neu, zahl:integer;
begin
 IF verbundengast=false THEN
  begin
   IF Athread.Connection.ReadLn='IASKYOU' THEN
    begin
     form7.Label4.Visible:=true;
     verbundengast:=true;
    end
  end
 ELSE IF verbundengast=true THEN
  begin
   IF netzwerkspiel=false THEN
    begin
     TRY
     neu:=AThread.Connection.ReadInteger(true);
     msg:=AThread.Connection.ReadString(neu);
     CASE msg[1] OF
     '2':Begin
         form2.RadioButton1.Checked:=false;
         form2.RadioButton2.Checked:=true;
         end;
     'A':Begin
         form2.RadioButton2.Checked:=false;
         form2.RadioButton1.Checked:=true;
         end;
     'G':Begin
         form7.CheckBox1.Checked:=true;
         form7.CheckBox1.Enabled:=false;
         netzwerkspiel:=true;
         end;
     'H':Begin
         form7.CheckBox1.Checked:=false;
         form7.CheckBox1.Enabled:=false;
         netzwerkspiel:=true;
         end;
     'N':Begin
         delete(msg,1,1);
         form7.Label4.Caption:=msg + ' hat sich connectet';
         form3.GroupBox2.Caption:=' ' + msg + ' ';
         form3.GroupBox6.Caption:=' ' + msg + ' ';
         end;
     'X':Begin
         delete(msg,1,1);
         form2.Edit2.Text:=msg;
         end;
       end;
      EXCEPT messagedlg('Es ist ein Fehler während der Spielinformationsübertragung aufgetreten', mtError, [mbOK], 0);
     end;
    end
   ELSE IF netzwerkspiel=true THEN
    Begin
     TRY
      neu:=AThread.Connection.ReadInteger(true);
      msg:=AThread.Connection.ReadString(neu);
      CASE msg[1] OF
       'D':Begin
           IF form2.RadioButton1.Checked THEN
           form3.BitBtn1.Enabled:=false
           ELSE form3.BitBtn1.Enabled:=true;
           end;
       'B':BEGIN
           form1.tcpb;
           saubermachen;
           end;
       'K':tcpk(msg);
       'M':Begin
           delete(msg,1,1);
           messagedlg(msg, mtInformation, [mbOK], 0);
           end;
      end
     EXCEPT messagedlg('Es ist ein Fehler während der Datenübertragung aufgetreten', mtError, [mbOK], 0);
    end;
   end;
  end;
end;

procedure TForm1.tcpb;
Begin
          oben.netzwerkspiel:=false;
          oben.verbundengast:=false;
          form7.Label4.Visible:=false;
          form2.GroupBox2.Enabled:=true;
          form2.GroupBox3.Enabled:=true;
          form7.CheckBox1.Enabled:=true;
          form2.Edit1.Enabled:=true;
          form2.Edit2.Enabled:=true;
          showmessage('Ihr Mitspieler hat sich getrennt');
end;

procedure tcpk(msg :String);
Begin
          delete(msg,1,1);
          form3.Label13.Caption:=InttoStr(StrtoInt(form3.Label1.Caption) - StrtoInt(msg));
          form3.Label14.Caption:=InttoStr(StrtoInt(form3.label13.caption) + Strtoint(form3.Label14.Caption));
          form3.Label1.Caption:=msg;
          form3.Label15.Caption:=InttoStr(StrtoInt(form3.label15.caption) + 1);
          IF spielfeld.jt = true THEN
          spielfeld.winner(2)
          ELSE
            form3.BitBtn1.Enabled:=true;
end;


Hier der vom Client (Auszug)



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:
procedure TForm1.verbinden;
begin
form1.idTCPclient1.Disconnect;
form1.idTCPclient1.Connect;
end;

procedure TForm1.writeint(s :char);
begin
  form1.IdTCPClient1.WriteInteger(1);
  form1.idTCPclient1.Write(s);
end;

procedure TForm1.tcpsender;
begin
form1.idTCPclient1.WriteLn('IASKYOU');
verbinden;
form1.IdTCPClient1.WriteInteger(length(form2.Edit1.Text) +1);
form1.IdTCPClient1.Write('N' + form2.Edit1.Text);
IF form7.CheckBox1.Checked=true THEN
 begin
    form1.IdTCPClient1.WriteInteger(length(form2.Edit2.Text) +1);
    form1.IdTCPClient1.Write('X' + form2.Edit2.Text);
    IF form2.RadioButton1.Checked THEN
     writeint('2')
    ELSE writeint('A');
    writeint('H');
    verbinden;
 end
ELSE
 writeint('G');
 verbinden;
end;


Für Hilfe wäre ich wirklichsehr dankbar


achterburg - Fr 03.10.03 21:11

Da ich keine speziellen Server undClient für das Spiel nutze, habe ich generell sowohl einen Indy Server als auch Client im Programm. Die nutzen allerings auch den gleichen Port. Wenn ich also ein Spiel starte und von einem auf den anderen Rechner zugreife, benutzt in jedem Programm sowohl der Client als auchder Server Port X. Kann mir nicht vorstellen, dass das so gut ist Ich habe per idTCPServer1.DefaultPort versucht, den Port zu ändern, das funzt aber nicht.

Hat jmd ne Idee, wie ich den Port des Servers während des Betriebes ändern kann, also nur den Befehl dazu?