Hallo an alle,
ich habe vor kurzem mit Delphi angefangen, habe aber auch schon in andersn Sprachen programmiert. Nun wollte ich als erstes Programm einen Chat basteln. Dazu sind die Sockets am geeignetsten. Also habe ich das hier geschrieben:
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: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249:
| unit Unit3;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Sockets, ScktComp, ToolWin, ComCtrls;
type TForm3 = class(TForm) GroupBox1: TGroupBox; GroupBox2: TGroupBox; Edit1: TEdit; Button1: TButton; Edit2: TEdit; Edit3: TEdit; Button2: TButton; GroupBox3: TGroupBox; Memo1: TMemo; Edit4: TEdit; Button3: TButton; ClientSocket1: TClientSocket; ServerSocket1: TServerSocket; GroupBox4: TGroupBox; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure ClientSocket1Onread(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1Onread(Sender: TObject; Socket: TCustomWinSocket); procedure Edit1OnKeyPress(Sender: TObject; var Key: Char); procedure Edit3OnKeyPress(Sender: TObject; var Key: Char); procedure Edit2OnKeyPress(Sender: TObject; var Key: Char); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Form3OnClose(Sender: TObject; var Action: TCloseAction); private public end;
var Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject); begin try form3.caption := 'Server'; ServerSocket1.Port:=StrToInt (Edit1.Text); ServerSocket1.Open; Memo1.Lines.Add('Chatroom (Server) erfolgreich erstellt.'); except Memo1.Lines.Add('Fehler beim erstellen eines Chatrooms (Server)!'); end; end;
procedure TForm3.Button2Click(Sender: TObject); begin try form3.Caption := 'Client'; ClientSocket1.Port:=StrToInt (edit3.Text); ClientSocket1.Host:=edit2.Text; ClientSocket1.open; Button3.Enabled:=true; ClientSocket1.Socket.SendText('c: Client tritt bei'); Memo1.Lines.Add('Verbindung zum Server wurde hergestellt.'); except Memo1.Lines.Add('Fehler beim Verbinden mit dem Server!'); end; end;
procedure TForm3.Button3Click(Sender: TObject); begin if form3.caption='Server' then begin if Serversocket1.Socket.ActiveConnections=1 then begin try Memo1.lines.add('Server:'+edit4.text); serversocket1.Socket.Connections[0].SendText(edit4.text); except Memo1.Lines.Add('Fehler beim Senden einer Nachricht an den Client!'); end; end else begin Memo1.lines.add('Es ist noch kein Client/Chatpartner da.'); Edit4.text:=''; end;
if form3.caption='Client' then begin if Clientsocket1.Active=true then begin try Memo1.lines.add('Client:'+edit4.text); clientsocket1.Socket.SendText('n:'+edit4.text); except Memo1.Lines.Add('Fehler beim Senden einer Nachricht an den Server!'); end; end else begin Memo1.lines.add('Du bist mit keinem Server verbunden.'); end; end; Edit4.text:=''; end; end;
procedure TForm3.Button4Click(Sender: TObject); begin if form3.caption='Client' then begin try Clientsocket1.Close; memo1.Lines.add('Verbindung geschlossen'); except memo1.Lines.Add('Fehler beim Schließen der Verbindung!'); end; end;
if form3.caption='Server' then begin try Serversocket1.Close; memo1.Lines.add('Server (Chatroom) geschlossen'); except memo1.Lines.Add('Fehler beim Schließen des Servers!'); end; end; Form3.Caption:='Simple TCP Chat'; end;
procedure TForm3.Button5Click(Sender: TObject); begin memo1.Lines.Add('HILFE:'); memo1.Lines.Add(''); memo1.Lines.Add('Wenn man einen neuen Chat erstellen will, muss man einen Port angeben.'); memo1.Lines.Add('Ein Port ist sozusagen ein Anschluss am PC.'); memo1.Lines.Add('Man sollte dort eine Zahl über 1024 angeben, aber es kommt immer auf den Computer/Server an, welche Ports frei sind.'); memo1.Lines.Add(''); memo1.Lines.Add('Wenn man sich mit einem Vorhanden Server, also mit einem vorhandenen Chat, verbinden will, muss man die IP und den Port des anderen Nutzer eingeben.'); memo1.Lines.Add('Es kann sich (bis jetzt) immer nur ein Client mit einem Chat verbinden.'); end;
procedure TForm3.ClientSocket1Onread(Sender: TObject; Socket: TCustomWinSocket); begin memo1.Lines.Add('Server:' + socket.receivetext); end;[/color]
procedure TForm3.Edit1OnKeyPress(Sender: TObject; var Key: Char);
begin if NOT (Key in [#8, '0'..'9']) then Key := #0; end;
procedure TForm3.Edit2OnKeyPress(Sender: TObject; var Key: Char);
begin if NOT (Key in [#8, '0'..'9', '.']) then Key := #0; end;
procedure TForm3.Edit3OnKeyPress(Sender: TObject; var Key: Char);
begin if NOT (Key in [#8, '0'..'9']) then Key := #0; end;
procedure TForm3.Form3OnClose(Sender: TObject; var Action: TCloseAction); begin if form3.caption='Client' then begin Clientsocket1.Close; end;
if form3.caption='Server' then begin ServerSocket1.Close; end; end;
procedure TForm3.ServerSocket1Onread(Sender: TObject; Socket: TCustomWinSocket); var text: string; begin text:=Socket.ReceiveText; if text='c: Client tritt bei' then begin memo1.Lines.Add('Client hat sich verbunden.'); Button3.Enabled:=true; end else begin Delete(text, 1, 2); memo1.Lines.Add('Client:' + text); end end;
end. |
So, wenn ich auf meinem Computer einen Server erstelle funktioniert das Prima, jetzt gibt es aber folgende(s) Problem(e):
1. Ich muss den 'Verbinden Button' zweimal anklicken, damit eine Nachricht am Server ankommt (siehe Z.79). In das Memo-Feld vom Client wird (logischerweise) schon eine 'Erfolgs-Meldung' geschrieben.
2. Der Server kann zwar an den Client etwas senden, aber der Client nicht an den Server. Noch nicht mal das Edit wird geleert! Vielleicht ist Clientsocket1.Active<>true ??? Aber dann würde ja wenigstens das Edit-Feld geleert werden. Also müsste ja caption <> 'Client', aber das wird ja dann dazu gesetzt!
Was mache ich falsch? Wo liegt der Fehler?
Ich hoffe ihr könnt mir helfen.
Viele Grüße, maxda
Edit: Hier nochmal eine Liste:
Button1: Server Erstellen
Button2: Client erstellen
Button3: Text senden
Button4: Verbindung schließen
Button5: Hilfe aufrufen
Edit1: Server - Port
Edit2: Client - IP
Edit3: Client - Port
Edit4: Sende-Feld
Das erste Problem ist jetzt gelöst - es muss ins das senden der Nachricht an den Server muss ins OnConnect Ereigniss, aber das 2. ist immer noch aktuell.
2. Problem ist jetzt auch gelöst (end; war an der falschen stelle).