| Autor |
Beitrag |
MaikPoP
Hält's aus hier
Beiträge: 7
WinXP, Win7
D7, RAD2009
|
Verfasst: Fr 25.12.09 19:07
Ich habe mir Überlegt ob es gehen würde ein PeerToPeer Chat zu Schreiben mit Delphi? oder brauch ich eine zusätzliche P2PKomponente? denn P2P ist doch wenn ich mich nicht irre Server und Client Sockets auf einer form??? Wie fang ich da am besten an? giebt es dazu ein Thread? ich habe auch schon bei google gesucht und hab nur was von GNUC.dll was gefunden.
Lg Maik
|
|
MaikPoP 
Hält's aus hier
Beiträge: 7
WinXP, Win7
D7, RAD2009
|
Verfasst: Fr 25.12.09 23:16
Weiß denn keiner ein Raht zu diesem Thema
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Fr 25.12.09 23:24
Nur weil du in 4 Stunden keine Antwort bekommen hast, ist das doch lang kein Grund einen Doppelpost zu machen.
Eigentlich könnte das so Funktionieren, aber das müsste ja auch anders Funktioniere, du brauchst ja nur eine Verbindung.
Also der der Verbindet, ist "Server" und der den du ansprichst "Client".
Was du dir dabei anschauen solltest ist, wie man UPD löcher durch die Firewall schießt...
|
|
MaikPoP 
Hält's aus hier
Beiträge: 7
WinXP, Win7
D7, RAD2009
|
Verfasst: Fr 25.12.09 23:41
Upps Sorry
Meinst du so was wie "Firewall(Port) Forwarding"??? Dann brauch ich für ein P2PChat keine spezielle Komponente?
Lg Maik
Zuletzt bearbeitet von MaikPoP am Sa 26.12.09 00:37, insgesamt 1-mal bearbeitet
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Fr 25.12.09 23:42
sollte da nicht ein Host/Client Konzept ausreichen, wie auch bei Multiplayergames der Fall? Ein Mitchatter eröffnet die Session, erzeugt sich also dynamisch den Server/aktiviert den Server und der andere kann dann als Client beitreten...
|
|
MaikPoP 
Hält's aus hier
Beiträge: 7
WinXP, Win7
D7, RAD2009
|
Verfasst: Sa 26.12.09 18:32
Ich habe es mal so Versucht mit Hilfe von Narses Tutorial. Ein Server beim Program Start zu starten läuft auch. Dann per Klick auf Nutzer liste einen client zu Erzeugen und da ist etwas nicht ganz richtig nur ich weiß einfach nicht was.
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:
| type TClient = class private CliSocket : TClientSocket; procedure CliSocketRead(ASender: TObject; Socket: TCustomWinSocket); procedure CliSocketError(ASender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure CliSocketConnect(ASender: TObject; Socket: TCustomWinSocket); procedure CliSocketDisconnect(ASender: TObject; Socket: TCustomWinSocket); Public Constructor CreateNewSession(IP, UserID :string); reintroduce; end;
Type TForm2 = class(TForm) GroupBox1: TGroupBox; PageControl1: TPageControl; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; ImageList1: TImageList; ToolBar2: TToolBar; ToolButton5: TToolButton; ToolButton6: TToolButton; ToolButton7: TToolButton; Memo1: TMemo; ImageList2: TImageList; LMDSimplePanel1: TLMDSimplePanel; Image1: TImage; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; StaticText1: TStaticText; LMDSimplePanel2: TLMDSimplePanel; LMDSpeedButton1: TLMDSpeedButton; Log: TMemo; private public Procedure CreateNewTab(UserID:String);
procedure ParseBuffer; function GetCmdToken(const StrToken: String): TCmdToken; procedure ExecuteX(const Command: TCmdToken; Data: TStringList); end;
var Form2: TForm2;
ReceiveBuffer: String; Tab: TTabSheet; WB: TWebbrowser;
ASender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; ErrorCode: Integer;
implementation uses Unit1; {$R *.dfm}
procedure TForm2.ParseBuffer; var Data: TStringList; Current: TCmdToken; OutOfArg: Boolean; begin Data := TStringList.Create; try Data.Text := ReceiveBuffer; OutOfArg := FALSE; while ( (Data.Count > 0) and (NOT OutOfArg) ) do begin Current := GetCmdToken(UpperCase(Data.Strings[0])); if (Data.Count >= Syntax[Current].ArgCount) then ExecuteX(Current,Data) else OutOfArg := TRUE; end; ReceiveBuffer := Data.Text; finally Data.Free; end; end;
function TForm2.GetCmdToken(const StrToken: String): TCmdToken; begin Result := Low(Syntax); while ( (Result < cmdERROR) and (StrToken <> Syntax[Result].Text) ) do Inc(Result); end;
procedure TForm2.ExecuteX(const Command: TCmdToken; Data: TStringList); var i: Integer; begin case Command of cmdNOP: ; cmdSAID: Log.Lines.Add(Data.Strings[1]+': '+Data.Strings[2]); cmdUSER: form1.Clients.Items.CommaText := Data.Strings[1]; cmdIP: form1.Clients.Items.CommaText := Data.Strings[1]; else form1.WriteEvLog('Unbekanntes Kommando: '+Data.Strings[0]); end; for i := 1 to Syntax[Command].ArgCount do Data.Delete(0); end;
Procedure TForm2.CreateNewTab(UserID:String); begin Tab := TTabsheet.Create(self); Tab.PageControl := PageControl1; Tab.Caption := UserID; Tab.Name := 'TabX' + IntToStr(PageControl1.PageCount); PageControl1.ActivePage := Tab; WB := TWebbrowser.Create(self); TControl(WB).Parent := Tab; TControl(WB).Name := 'Webbrowser' + IntToStr(PageControl1.PageCount); WB.Visible := true; WB.Align := alClient; end;
Constructor TClient.CreateNewSession(IP, UserID :string); begin CliSocket := TClientSocket.Create(nil); try CliSocket.OnConnect(ASender, Socket); CliSocket.OnDisconnect(ASender, Socket); CliSocket.OnError(ASender, Socket,ErrorEvent,ErrorCode); CliSocket.OnRead(ASender, Socket);
with CliSocket do begin Name := 'Cli_'+UserID; Port := Server_port; Host := IP; Active := true; end; except exit; end; end;
procedure TClient.CliSocketRead(ASender: TObject; Socket: TCustomWinSocket); begin ReceiveBuffer := ReceiveBuffer +Socket.ReceiveText; if (ReceiveBuffer <> '') then form2.ParseBuffer; end;
procedure TClient.CliSocketError(ASender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode := 0; form2.Log.Lines.Add('Verbindungsfehler!'); end;
procedure TClient.CliSocketConnect(ASender: TObject; Socket: TCustomWinSocket); begin ReceiveBuffer := ''; form2.Log.Clear; form2.Log.Lines.Add('Verbunden mit: '+CliSocket.Host); Socket.SendText(Syntax[cmdNICK].Text+#13+form1.LabeledEdit1.Text+#13); end;
procedure TClient.CliSocketDisconnect(ASender: TObject; Socket: TCustomWinSocket); begin form1.Clients.Clear; form2.Log.Lines.Add('Verbindung getrennt.'); end; end. |
aber irgend wie bekomme ich nur Fehler Meldung das der Port nur Einmal Genutzt werden darf und
| Zitat: |
Im Projekt ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000. Process wurde Angehalten.
|
ich denke mal das ich da irgend wo was Vergessen habe oder
Schaut euch das mal bitte an vllt findet ihr ja den Fehler.
Lg Maik
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 26.12.09 20:53
Also:
Als erstes debuggen und sagen, in welcher zeile der fehler kommt.
Hier ist es zum glück klar:
Delphi-Quelltext 1: 2: 3: 4:
| CliSocket.OnConnect(ASender, Socket); CliSocket.OnDisconnect(ASender, Socket); CliSocket.OnError(ASender, Socket,ErrorEvent,ErrorCode); CliSocket.OnRead(ASender, Socket); |
Damit rufst du funktionen auf!
Du wolltest sie aber zuweisen!
|
|
MaikPoP 
Hält's aus hier
Beiträge: 7
WinXP, Win7
D7, RAD2009
|
Verfasst: Sa 26.12.09 23:03
Flamefire hat folgendes geschrieben : | Also:
Als erstes debuggen und sagen, in welcher zeile der fehler kommt.
Hier ist es zum glück klar:
Delphi-Quelltext 1: 2: 3: 4:
| CliSocket.OnConnect(ASender, Socket); CliSocket.OnDisconnect(ASender, Socket); CliSocket.OnError(ASender, Socket,ErrorEvent,ErrorCode); CliSocket.OnRead(ASender, Socket); |
Damit rufst du funktionen auf!
Du wolltest sie aber zuweisen! |
Er hat mir ja keine Zeile Angegeben nur halt das er ein Fehler Gefunden hat nur wo sagt er mir net.
Aber bei Console schreibt man das doch auch oder nicht wenn die Komponente werend der laufzeit erstellt wird?
Wie kann ich das denn noch schreiben denn ich brauch doch die Angaben im Chat? habe kein Plan
Sorry das ich so dumm Frage bei diesem Thema aber ich habe ein leichtes Deutsch Problem bin Norweger denoch ist das hier das Beste Forum was ich finden konnte zum Thema. Danke an alle
Habe die Lösung des Problems gefunden es lag tatsächlich an dem. Danke für eure Hilfe
Lg Maik
|
|