Hallo
Ich wollte mal ein Mehrspielerspiel programmieren und habe dazu mal
ein bishen in die Beispielprogrammen von Delphi 7 gesehen zweck Netzwerk.
Um mich damit etwas vertraut zu machen habe ich mir ein kurzes Chatprogramm
geschrieben.
Bei Senden hab ich folgendes:
Delphi-Quellcode:
procedure TForm2.Button3Click(Sender: TObject);
var I,ih: Integer;
s:string;
begin
memo4.Lines.Text:=''; //Memo4 ist die Liste wen man nicht erreicht hat
ih:=0;
while ih<= memo3.items.Count-1 do
begin
TcpClient1.RemoteHost := Memo3.items[ih]; //Memo3 ist die Liste an wen es gesendet werden soll
try
if TcpClient1.Connect then
begin
for I := 0 to Memo2.Lines.Count-1 do //Memo2 ist das Eingabefeld
begin
TcpClient1.Sendln(Memo2.Lines[I]);
end;
end
else
begin
Memo4.Lines.Add('Konnte '+memo3.items[ih]+' nicht ereichen');
if Checkbox2.Checked then
begin
memo3.Items.Delete(ih);
ih:=ih-1;
end;
missed:=missed+1;
Statusbar1.Panels.Items[2].Text:='Nicht erreicht: '+inttostr(missed);
end;
finally
TcpClient1.Disconnect;
ih:=ih+1;
end;
Memo1.SelStart:=length(Memo1.Lines.Text);
Memo1.SetFocus;
end;
Memo1.Lines.Add('Sie ('+DateTimeToStr(GetCurrentDateTime)+')'); //Memo1 ist das ChatFenster
Memo1.Lines.Add('');
Memo1.Lines.Text:=Memo1.Lines.text+Memo2.Lines.text;
if memo4.Lines.Text <> '' then
begin
Memo1.Lines.Add('');
Memo1.Lines.Add('===== Begin of Log =====');
memo1.Lines.Text:=memo1.Lines.Text+memo4.Lines.Text;
Memo1.Lines.Add('===== End of Log =====')
end;
Memo1.Lines.Add('');
Memo1.Lines.Add('');
end;
bei Empfangen:
Delphi-Quellcode:
procedure TForm2.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
s,d: string;
i,col:integer;
files: TFileStream;
begin
if Memo5.Lines.IndexOf(ClientSocket.LookupHostName(ClientSocket.RemoteHost)) <> -1 then//Die Memo5 ist eine IgnoreList
begin
igno:=igno+1;
Statusbar1.Panels.Items[3].Text:='Ignorierte Meldungen: '+inttostr(igno);
Statusbar1.Panels.Items[4].Text:='Letzte Ignorierte Nachricht ist von: '+ClientSocket.LookupHostName(ClientSocket.RemoteHost);
abort;
end;
if Memo3.items.IndexOf(ClientSocket.LookupHostName(ClientSocket.RemoteHost)) =-1 then
begin
messagebox(0,'Ein Chatter hat ihnen eine Nachricht geshickt,'+#10#13+'er wurde der Liste hinzugefügt','Neuer Chatter',0);
Memo3.items.Add(ClientSocket.LookupHostName(ClientSocket.RemoteHost));
end;
col:=strtoint(Memo6.Lines[Memo3.items.IndexOf(ClientSocket.LookupHostName(ClientSocket.RemoteHost))]);
memo1.SelAttributes.Color:= col;
memo1.lines.Add(ClientSocket.LookupHostName(ClientSocket.RemoteHost)+' ('+DateTimeToStr(GetCurrentDateTime)+')');
memo1.Lines.Add('');
s := ClientSocket.Receiveln;
while s <> '' do
begin
memo1.SelAttributes.Color:= col;
memo1.lines.Add(s);
s := ClientSocket.Receiveln;
end;
memo1.lines.Add('');
memo1.lines.Add('');
If (not Form2.Active)and(Checkbox1.Checked) then // Hier soll es piepsen wenn das Fensterinaktiv
begin
windows.beep(1000,200);
windows.beep(1300,200);
windows.beep(1600,200);
end;
end;
Bei einem Test ist mir aufgefallen, das diese methode zwar Fehlerfrei funktioniert
aber nicht gerade schnell ist. Im extremfall ist es sogar mal vorgekommen das die
Nachricht erst 2 Minuten später ankam. Das ist Natürlich untauglich für ein MP-Spiel.
Kann man die Methode nicht noch verbessern?
Oder gibts da noch ne andere (Ich weiß, dass es noch
Indy gibt aber damit hatte ich bisher 0 zu tun.)?
Es tut mir Leid mit den ganzen Memo1 bis 5 im Text aber beim Programmieren hab ich daruf nicht geachtet und wenn mans
hinterher ändert wirds noch komischer.
Ich wäre für verbesserungsvorschläge dankbar.
Oder wenn sich jemand die mühe macht mir das Indy zu erklären