| Autor |
Beitrag |
der_zaehe
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: So 23.01.05 17:32
Hi ihr alle!
Ich programmiere momentan an einer chat-anwendung (mit delphi 6 personal), es lief bis jetzt auch ganz gut, bis ich dann zu dem punkt gekommen bin , an dem der nick übertragen werden soll. Bis jetzt hab ich alles per SendText gemacht (ich benutze die TServerSocket und TClientSocket Komponenten), für den nick brauche ich nun aber einen record, der aus dem nick und dem text besteht. Ich hab probiert, die sache mit SendBuf und ReceiveBuf zu übertragen, erzeuge aber damit nur manigfaltige zugriffsverletzungen  .
Da ich nicht so recht den Plan hab, wie das funktioniert, fänd ich es toll, wenn ihr hier gleich neuen code reinstellen könntet statt mein gemülle zu korrigieren
Als Anmerkung:
ich hab erst seit nem halben jahr informatik und somit delphi, bin also noch ziemlich unerfahren und auch hier in dem forum neu. Deshalb würde ich euch bitten, komplizierteren code evtl. ein bisschen näher zu erläutern. Wie gesagt, ich bin noob 
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 23.01.05 17:38
| der_zaehe hat folgendes geschrieben: | fänd ich es toll, wenn ihr hier gleich neuen code reinstellen könntet statt mein gemülle zu korrigieren [..] Deshalb würde ich euch bitten, komplizierteren code evtl. ein bisschen näher zu erläutern. Wie gesagt, ich bin noob  |
Nur eine Frage: du kommst in ein Form, schreibst du willst Code und Erklärungen dazu - das Ganze am besten noch gratis - und erwartest allen Ernstes, dass sich hier auch nur ein User melden wird, der das macht?
Post deinen Code, dann reden wir weiter
AXMD
|
|
der_zaehe 
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: So 23.01.05 18:12
| AXMD hat folgendes geschrieben: | Post deinen Code, dann reden wir weiter  |
*aufdierübekrieg*  tschuldigung, wenn meine anfrage zu fordernd war
hier ist der code
Server:
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:
| unit Unit1_Server;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;
type TForm1 = class(TForm) Server: TServerSocket; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket); private public end;
var Form1: TForm1; Text2 : String;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Clear; Server.Port := 10024; Server.Open; end;
procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var i : Integer; BufferSize : Integer; begin BufferSize := Socket.ReceiveLength; Socket.ReceiveBuf(Text2,BufferSize); Memo1.Lines.Add(Text2); for i := 0 to Server.Socket.ActiveConnections-1 do if Server.Socket.Connections[i].Connected then Server.Socket.Connections[i].SendBuf(Text2,SizeOf(Text2)); end;
procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Socket.SendText('Server: Verbunden mit '+Socket.LocalHost+' (IP '+Socket.LocalAddress+') Alles Klar, Roger.'); end;
end. |
Client:
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:
| nit Unit1_Client;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Client: TClientSocket; Sendeknopp: TButton; TextEdit: TMemo; HostEdit: TEdit; Trennknopp: TButton; PortEdit: TEdit; NickEdit: TEdit; HostStatic: TStaticText; PortStatic: TStaticText; NickStatic: TStaticText; EinstellungenGB: TGroupBox; Verbindeknopp: TButton; CSRG: TRadioGroup; ServerRadioButton: TRadioButton; ClientRadioButton: TRadioButton; ChatGB: TGroupBox; ChatMemo: TMemo; procedure FormCreate(Sender: TObject); procedure SendeknoppClick(Sender: TObject); procedure VerbindeknoppClick(Sender: TObject); procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure TrennknoppClick(Sender: TObject); procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure SchreibeChat(pText: string); private public end;
var Form1: TForm1; Text1 : String; IP : String; Port : Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin TextEdit.Lines.Clear; ChatMemo.Lines.Clear; end;
procedure TForm1.SendeknoppClick(Sender: TObject); begin if Client.Socket.Connected AND NOT ((TextEdit.Text ='') OR (NickEdit.Text = '')) then begin Text1 := TextEdit.Text; Client.Socket.SendBuf(Text1,SizeOf(Text1)); end; end;
... |
ich hoff mal der code reicht aus
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: So 23.01.05 18:36
Hallo,
dein Quelltext sieht doch ganz vernünftig aus. Funktioniert er den auch? Wenn ja, dann musst du ja nur minimale Dinge ändern um einen Record zu übertragen: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Test: TRecord; begin SendBuf(Test, SizeOf(Test)); end;
var Test: TRecord; begin FillChar(Test, SizeOf(Test), 0); ReceiveBuf(Test); end; | Ich schätze mal, dass du Probleme mit Records hast, weil du darin Strings benutzt, deren Länge variabel sein soll. Wenn das so ist, dann schreib nochmal zurück, dann überleg ich mir was.
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
der_zaehe 
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: So 23.01.05 20:10
| wulfskin hat folgendes geschrieben: |
Ich schätze mal, dass du Probleme mit Records hast, weil du darin Strings benutzt, deren Länge variabel sein soll. Wenn das so ist, dann schreib nochmal zurück, dann überleg ich mir was.
|
Genauso siehts aus 
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 24.01.05 00:17
Moin!
Ich halte es für sinnvoller, ein Protokoll zu definieren und bei SendText zu bleiben. Das ist auch leichter zu debuggen, als binäre Daten zu übertragen. Gerade bei einem Chat ist es nicht so wichtig, besonders effiziente Datenübertragung zu implementieren, da dort das Datenaufkommen sehr gering ist.
Du kannst z.B. mit der Methode .CommaText und Stringlisten arbeiten, um dir das Parsen der Strings etwas leichter zu machen. Schau mal in die Online-Hilfe zu den genannten Dingen.
//EDIT: Hier ist ein Tutorial zum Thema Protokoll, das alle hier noch offenen Fragen klären sollte. Weiterhin ist hier die Erklärung, warum man besser nicht records versenden sollte.
cu
Narses
Zuletzt bearbeitet von Narses am So 04.06.06 22:47, insgesamt 1-mal bearbeitet
|
|
der_zaehe 
      
Beiträge: 317
WinXP SP2
D6 Pers, D2005 Prof, VS2005
|
Verfasst: Mo 24.01.05 14:57
danke für den tip!
die methode kannte ich nicht, geschweige denn den datentyp stringlist
|
|
|