Autor Beitrag
der_zaehe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: 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 :lol: :shock: .
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 :wink:
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 :D
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: So 23.01.05 17:38 
:welcome:

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 :D


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 :evil:

AXMD
der_zaehe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: So 23.01.05 18:12 
AXMD hat folgendes geschrieben:
Post deinen Code, dann reden wir weiter :evil:

*aufdierübekrieg* :? tschuldigung, wenn meine anfrage zu fordernd war
hier ist der code

Server:
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:
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
    { Private declarations }
  public
    { Public declarations }
  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
  {Text2 := Socket.ReceiveText;
  Memo1.Lines.Add(Text2);
  for i := 0 to Server.Socket.ActiveConnections-1 do
    if Server.Socket.Connections[i].Connected then
      Server.Socket.Connections[i].SendText(Text2);}
 //Vorherige Empfangs-Prozedur
  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:
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:
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
    { Private declarations }
  public
    { Public declarations }
  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.SendText(NickEdit.Text+': '+Text1);
    TextEdit.Text := '';
  end;}
 //vorherige Sende-Procedure
  if Client.Socket.Connected AND NOT ((TextEdit.Text ='') OR (NickEdit.Text = '')) then
  begin
    Text1 := TextEdit.Text;   //Zu Testzwecken bis jetzt nur mit einem Text, sobald es geht mit record
    Client.Socket.SendBuf(Text1,SizeOf(Text1));
  end;
end;

...


ich hoff mal der code reicht aus
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
//Senden
var
  Test: TRecord;
begin
  SendBuf(Test, SizeOf(Test));
end;

//Empfangen
var
  Test: TRecord;
begin
  FillChar(Test, SizeOf(Test), 0); //mit nullen füllen (initialisieren)
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: Mo 24.01.05 14:57 
danke für den tip! :D
die methode kannte ich nicht, geschweige denn den datentyp stringlist