Problem mit ServerSocket bzw. ClientSocket
-
Hi,
hab mal versucht ein kleines ChatProgramm fürs interne Netzwerk zu erstellen. Habe jetzt nur folgendes Problem:
Der Server zeigt zwar die Messages in RichEdit an, die ich ihm aus dem Clienten (auch über ein RichEdit) sende, aber der Server sendet NICHTS
an den Clienten!?!Bin den Code jetzt schon zich mal durch gegangen (hab ihn auch mit nem Beispiel-Code verglichen), finde aber einfach keinen Fehler!!!
Hier mal einige ausschnitte:
void __fastcall TForm1::FileListenClick(TObject *Sender) { FileListen->Checked = !FileListen->Checked; if(FileListen->Checked) { ClientSocket->Active =false; ServerSocket->Active =true; StatusBar1->Panels->Items[0]->Text = "Checke Verbindung..."; } else { if(ServerSocket->Active) ServerSocket->Active =false; StatusBar1->Panels->Items[0]->Text = ""; } } //--------------------------------------------------------------------------- void __fastcall TForm1::ConnectButtonClick(TObject *Sender) { if(ClientSocket->Active) ClientSocket->Active =false; if(InputQuery("Verbindung herstellen...", "Bitte geben Sie den Server-Namen ein:", Server)) { if(Server.Length() > 0) { ClientSocket->Host =Server; ClientSocket->Active =true; } } } //--------------------------------------------------------------------------- void __fastcall TForm1::ExitClick(TObject *Sender) { ServerSocket->Close(); ClientSocket->Close(); Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SenderButtonClick(TObject *Sender) { if (IsServer) ServerSocket->Socket->Connections[0]->SendText(RichEditEingabe->Lines->Strings[RichEditEingabe->Lines->Count - 1]); else ClientSocket->Socket->SendText(RichEditEingabe->Lines->Strings[RichEditEingabe->Lines->Count - 1]); Eingabe->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocketError(TObject* Sender,short number,AnsiString &Description,int scode,const AnsiString Source,const AnsiString HelpFile,int HelpContext,Word &CancelDisplay) { ShowMessage(Description); } //--------------------------------------------------------------------------- void __fastcall TForm1::DisconnectButtonClick(TObject *Sender) { ClientSocket->Close(); FileListenClick(NULL); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocketConnect(TObject* Sender, TCustomWinSocket* Socket) { StatusBar1->Panels->Items[0]->Text = "Verbunden mit Server: " +Socket->RemoteHost; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocketRead(TObject* Sender, TCustomWinSocket* Socket) { RichEditAusgabe->Lines->Add(Socket->ReceiveText()); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocketClientRead(TObject* Sender, TCustomWinSocket* Socket) { RichEditAusgabe->Lines->Add(Socket->ReceiveText()); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocketAccept(TObject* Sender, TCustomWinSocket* Socket) { StatusBar1->Panels->Items[0]->Text = "Verbunden mit Server: " +Socket->RemoteAddress; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocketClientConnect(TObject* Sender, TCustomWinSocket* Socket) { RichEditAusgabe->Lines->Add("Verbunden mit Server: " +Server); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocketDisconnected(TObject* Sender, TCustomWinSocket* Socket) { RichEditAusgabe->Lines->Add("Ihre Verbindung wurde getrennt"); FileListenClick(NULL); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocketError(TObject* Sender, TCustomWinSocket* Socket, TErrorEvent ErrorEvent, int &ErrorCode) { RichEditAusgabe->Lines->Add("Keine Verbindung zum Server: " +Server); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocketClientDisconnect(TObject* Sender, TCustomWinSocket* Socket) { ServerSocket->Active =false; FileListen->Checked = !FileListen->Checked; FileListenClick(NULL); }Könnt ihr mir vielleicht weiter helfen???
Ich bin echt am verzweifeln!!!!
-
1. du solltest dir angewöhnen, wenn du ein problem hast und code postest, nur das nötige zu posten.
würde mich verwundern wenn das hier mehr als 3 personen durchlesen.. oder sogar versuchen nachzuverfolgen.
2. prüfe beim mal beim senden, ob die Connections[0] wirklich connected ist
-
Hi,
kann das Problem aber nicht finden!?!
-
Debuggen... Rückgabewerte von Funktionen überprüfen...
-
ClientSocket->Active =true;ist pöse pöse pöse !
Nimm lieber:
ClientSocket->Open()Ich hab das mal vor Zeiten so gelöst:
for (i = 0;i <= max;i++) //Weiterleitung an alle verbundenen Clients { if(ServerSocket1->Socket->Connections[i]->Connected) { ServerSocket1->Socket->Connections[i]->SendText(String(Time())+ " " +name+ ": "+Edit1->Text+endezeichen); } }Überprüfe erst den Verbindungsstatus bevor du schreibst !
Der integer max wird bei OnConnect (letzte Instanz eines connects) hochgezählt und bei disconnect runtergezählt
-
Hi
Habs mit dieser Lösung mal versucht, habe aber nach wie vor das Problem, das der Server nur empängt und der Client nur sendet. Wäre es evt. hilfreich, wenn ich das Prog in zwei einzelne Progs "splitte", quasi ein Serverprog und ein Clientprog mache?
-
Wird die Variable "IsServer" jemals "true"?
Debuggen!
-
Word epsilon !
Warum Frau Holle ? ob Client/Server in einem Prog oder zweien ist doch wurscht !
Du solltest nur ne entsprechende Struktur/Logik erkennen und programmieren.Ich stelle dir gerne meinen IRC clone zur Verfügung wenn du mal sehen willst wie sowas reibungslos funktioniert
-
@Zero: Das wäre echt nett von dir, kannst du mir das mal per ICQ oder Email schicken?