AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Einen Chat mit den Sockets programmieren
Tutorial durchsuchen
Ansicht
Themen-Optionen

Einen Chat mit den Sockets programmieren

Ein Tutorial von Ultimator · begonnen am 5. Mai 2004 · letzter Beitrag vom 30. Jan 2014
Antwort Antwort
Seite 11 von 11   « Erste     91011   
Benutzerbild von Ultimator
Ultimator
Registriert seit: 17. Feb 2004
So, hier nun mein erstes Tutorial: Wie baue ich mir einen Chat

Es geht darum, wie man einen Chat mit einem zentralen Server mit den Sockets baut. Es werden dabei TClientSocket und TServerSocket verwendet. Sollte es auf genügend positive Resonanz stoßen, würde ich mich eventuell bereiterklären, weitere Tutorials zu schreiben.Bitte meldet mir (Tipp-)Fehler und weiteres, damit ich es immer weiter ausbauen und verbessern kann. Ich wäre für jede Kritik (und natürlich auch jedes Lob) sehr dankbar. Genug geredet, hier ist es nun endlich.

[edit]Da bei manchen Leuten der Download nicht zu funktionieren scheint, probiert es mal mit "Ziel speichern unter". Alternativ dazu habe ich hier noch den Link zu der Datei auf meinem Webspace: http://home.arcor.de/ultimator/Chat-Tutorial_1.1.pdf

[edit=Phoenix]Tutorial aktualisiert. Mfg, Phoenix[/edit]
Angehängte Dateien
Dateityp: pdf chat-tutorial_1.1_123.pdf (62,0 KB, 1608x aufgerufen)
 
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#101
  Alt 10. Okt 2009, 18:09
Zitat von Ghostleader:
So der Chat ist jetzt fertig allerdings bekomme ich wie so viele andere den (unbeatworteten) fehler:
"Asynchroner Socket-Fehler 10060."

Was ist da los?!
Wenn es von PC1 <-> PC2 blockt da sicher noch irgendeine Firewall.
Manuel
  Mit Zitat antworten Zitat
Ghostleader

 
Delphi 2010 Professional
 
#102
  Alt 10. Okt 2009, 19:07
@Klaus... danke aber ich versteh nicht was ich dagegen tuen kann
gibts da eine möglichkeit das die "gegenstelle" auf den verbindungsaufbau versuch reagieren kann?
und wenn ja, wie sieht die als delphi befehl aus?

@DieMuhkuh... nein ist mein eigener chat und ich probier ihn selber aus
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

 
Delphi 2009 Professional
 
#103
  Alt 10. Okt 2009, 19:10
Solltest vielleicht mal den Code zeigen, ansonsten könnte die Fehlersuche etwas schwer sein.
Manuel
  Mit Zitat antworten Zitat
Ghostleader

 
Delphi 2010 Professional
 
#104
  Alt 10. Okt 2009, 19:15
okay einen moment:
(server und client sind in einem... einzelnd hab ich es auch aber so finde ich es besser - beides hat nichgeklappt -selber fehler)

Delphi-Quellcode:
unit pChat3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, DdeMan, IdBaseComponent, IdComponent, IdIPWatch,
  ExtDlgs, ComCtrls, Buttons, ScktComp, AppEvnts;

type
  TfmChat = class(TForm)
    MeChatlog: TMemo;
    BtSenden: TButton;
    EdSenden: TEdit;
    EdNickname: TEdit;
    btOK: TButton;
    MeWIO: TMemo;
    BtClose: TButton;
    MeChatverlauf: TMemo;
    CbStatus: TComboBox;
    cbOptionen: TComboBox;
    MeSupport: TMemo;
    MeCopyright: TMemo;
    MeHelp: TMemo;
    OpenDialog1: TOpenDialog;
    BtVerlauf: TButton;
    TmIP: TTimer;
    IdIPWatch1: TIdIPWatch;
    PaIP: TPanel;
    LaIPShow: TLabel;
    LaIP: TLabel;
    ImUser: TImage;
    BitBtn1: TBitBtn;
    ImStrich: TImage;
    DateTimePicker1: TDateTimePicker;
    OpenPictureDialog1: TOpenPictureDialog;
    ApplicationEvents1: TApplicationEvents;
    ClientSocket1: TClientSocket;
    PaServer: TPanel;
    ServerSocket1: TServerSocket;
    MeServer: TMemo;
    LaIPShow2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btOKClick(Sender: TObject);
    procedure EdNicknameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure EdNicknameClick(Sender: TObject);
    procedure BtSendenClick(Sender: TObject);
    procedure BtCloseClick(Sender: TObject);
    procedure CbStatusChange(Sender: TObject);
    procedure cbOptionenChange(Sender: TObject);
    procedure MeSupportDblClick(Sender: TObject);
    procedure BtVerlaufClick(Sender: TObject);
    procedure TmIPTimer(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure EdSendenChange(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Delay(time: word);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fmChat: TfmChat;

implementation

var Nickname: string;
var Nachricht: string;

procedure TFmChat.Delay(time:word);
var Start: Integer;
begin
Start:=GetTickCount;
while (GetTickCount)-(Start) <= time do
Application.ProcessMessages;
end;

{$R *.dfm}

procedure TfmChat.BtCloseClick(Sender: TObject);
begin
ClientSocket1.Socket.SendText (Nickname + 'hat den Chat verlassen.');
delay(500);
MeChatLog.Lines.SaveToFile ('Chat-Log.txt');
ClientSocket1.Close;
close;
end;

procedure TfmChat.btOKClick(Sender: TObject);
begin
Nickname:= EdNickname.text;
Nachricht:= (Nickname + ' hat den Raum betreten.');
delay(500);
ClientSocket1.Active:= True;
ClientSocket1.Socket.SendText (Nachricht);
BtSenden.Enabled:= True;
EdSenden.Enabled:= True;
MeChatlog.Enabled:= True;
Btok.Enabled:= False;
CbStatus.Enabled:= True;
MeWIO.Lines.Add (Nickname + ' <online>');
MeChatlog.Lines.SaveToFile ('Chat-Log.txt');
end;

procedure TfmChat.BtSendenClick(Sender: TObject);
begin
EdSenden.text:= Nachricht;
if (ClientSocket1.Active = True) and (EdSenden.text<>'') then
begin
  ClientSocket1.Socket.SendText (Nickname+ ' : '+ EdSenden.text);
end;
EdSenden.Text:='';

MeChatverlauf.Lines.LoadfromFile ('Chat-Log.txt');

end;

procedure TfmChat.BtVerlaufClick(Sender: TObject);
begin
OpenDialog1.Filter:= 'Text - Dokumente |*.txt';
OpenDialog1.FileName:= 'Wählen sie ihre Datei...';
OpenDialog1.Execute;
MeChatVerlauf.Lines.LoadFromFile (OpenDialog1.Filename);
end;

procedure TfmChat.CbStatusChange(Sender: TObject);
begin
if CbStatus.Itemindex = 1 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun online.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + ' <online>');
end;
if CbStatus.Itemindex = 2 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun beschäftigt.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + ' <Beschäftigt>');
end;
if CbStatus.Itemindex = 3 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun abwesend.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + ' <Abwesend>');
end;
if CbStatus.Itemindex = 4 then
begin
  MeChatlog.Lines.Add (Nickname + ' ist nun offline.');
  MeWIO.Lines.Clear;
  MeWIO.Lines.Add (Nickname + '-offline anzeigen-');
end;

end;

procedure TfmChat.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin

end;

procedure TfmChat.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
FmChat.Show;
MeChatlog.Lines.Add (Socket.ReceiveText);
end;

procedure TfmChat.cbOptionenChange(Sender: TObject);
begin
if CbOptionen.itemindex = 0 then
begin
  FmChat.Color:= Clskyblue;
  MeHelp.Visible:= False;
  MeSupport.Visible:= False;
  MeCopyright.Visible:= False;
end;
if CbOptionen.itemindex = 1 then
begin
  MeHelp.Visible:= True;
end
else
begin
  MeHelp.Visible:= False;
end;
if cbOptionen.itemindex = 2 then
begin
  MeSupport.Visible:= True;
end
else
begin
  MeSupport.Visible:= False;
end;
if cbOptionen.ItemIndex = 3 then
begin
  MeCopyright.Visible:= True;
end
else
begin
  MeCopyright.Visible:= False;
end;
if cbOptionen.Itemindex = 4 then
begin
  OpenPictureDialog1.Filename:= 'Ihre Datei...';
  OpenPictureDialog1.Execute;
  ImUser.Picture.LoadFromFile (OpenPictureDialog1.Filename);
end;
end;

procedure TfmChat.EdNicknameClick(Sender: TObject);
begin
EdNickname.Clear;
end;

procedure TfmChat.EdNicknameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Btok.Enabled:= True;
end;

procedure TfmChat.EdSendenChange(Sender: TObject);
begin
if EdSenden.text = 'Server.Listthen
begin
  PaServer.Visible:= True;
  FmChat.Height:= 636;
end
else
begin
  PaServer.Visible:= False;
  FmChat.Height:= 285;
end;
end;

procedure TfmChat.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
MeChatLog.Lines.SaveToFile('Chat-Log.txt');

end;

procedure TfmChat.FormCreate(Sender: TObject);
begin
LaIpShow2.Caption:= IdIPWatch1.LocalIP;
FmChat.Height:= 285;
ClientSocket1.Host:= '80.132.196.139' ;
ClientSocket1.Active:= True;
TmIP.Enabled:= True;
BtSenden.Enabled:= False;
EdSenden.Enabled:= False;
MeChatlog.Enabled:= False;
Btok.Enabled:= False;
MeChatverlauf.Lines.LoadfromFile ('Chat-Log.txt');
CbStatus.Enabled:= False;
CbOptionen.Enabled:= True;
MeSupport.Visible:= False;
MeCopyright.Visible:= False;
MeHelp.Visible:= False;

end;

procedure TfmChat.MeSupportDblClick(Sender: TObject);
begin
MeSupport.Visible:= False;
end;

procedure TfmChat.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  Var Text: String;
      i: integer;
begin
Text:=Socket.ReceiveText;
MeChatlog.Lines.add(Timetostr(now)+': '+Text);
For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections [I] do
if (Connected) then SendText(Text);
end;
end;

procedure TfmChat.TmIPTimer(Sender: TObject);
begin
LaIP.Caption:=IdIPWatch1.LocalIP;
end;

end.
ist ziemlich viel.

Me steht für Memo
La steht für Label
Ed steht für Edit
Tm steht für Timer
Bt steht für Button...


ansonsten einfach nachfragen
Michael
  Mit Zitat antworten Zitat
Ghostleader

 
Delphi 2010 Professional
 
#105
  Alt 11. Okt 2009, 20:28
hat da jemand ne ahnung?
Michael
  Mit Zitat antworten Zitat
Ghostleader

 
Delphi 2010 Professional
 
#106
  Alt 13. Okt 2009, 10:12
ist noch jemand für mich da ?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

 
Delphi 7 Enterprise
 
#107
  Alt 13. Okt 2009, 10:18
1. Willst du dafür nicht einen eigenen Thread aufmachen (dann gibt es meist auch mehr Resonanz)

2. Das könnte dem Socket ein wenig zu schnell gehen:
Delphi-Quellcode:
ClientSocket1.Active:= True;
ClientSocket1.Socket.SendText (Nachricht);
Das Socket sendet ein Ereignis, wenn es fertig zum "schreiben" ist.
  Mit Zitat antworten Zitat
DelphiProgrammer

 
Delphi 10.2 Tokyo Starter
 
#108
  Alt 30. Jan 2014, 07:19
Hi,

ich habe den chat programmiert und auf einem rechner funktoniert alles prima. Wenn ich jetzt aber
auf einem rechner server und einen client laufen lasse und auf einem anderen rechner(im netzwerk)
einen zweiten client habe geht nur der teil, der auf dem rechner mit dem server ist alles prima
mit rechner 2 kann ich micht nicht verbinden!
Verbindung haben beide - sie sind im selben Heimnetzwerk - und ich habe rechner 1 (der mit server)
auch angepingt: ging. Port ist 7777 denke der wird nicht belegt sein...

LG Christopher
Christopher
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock
Online

 
Delphi 11 Alexandria
 
#109
  Alt 30. Jan 2014, 11:12
Die IP-Adresse des zweiten Client hast du wo und wie im Server verarbeitet?

Sherlock
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 11 von 11   « Erste     91011   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz