Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [DELPHI] Inviare e ricevere dati tramite UDP

    Ho scritto i seguenti due progetti:

    Server:
    codice:
    var
      Form2: TForm2;
      HHost: string;
    
    implementation
    
    {$R *.dfm}
    procedure TForm2.AddLog(Text: string);
    begin
    Log.Lines.Add(TimeToStr(Now) + ': ' + Text);
    end;
    
    procedure TForm2.ConnBtnClick(Sender: TObject);
    begin
    if FileExists('local') then
      HHost := IP.CurrentIP
    else
      HHost := '192.168.0.2';
    Server.Active := true;
    end;
    
    procedure TForm2.SendBtnClick(Sender: TObject);
    begin
    Server.Send(IP.CurrentIP, 1718, Cmd.Text);
    end;
    
    procedure TForm2.ServerUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
    begin
    AddLog(ABinding.IP + ' -> ' + BytesToString(AData));
    end;
    
    procedure TForm2.TimerTimer(Sender: TObject);
    begin
    if Server.Active then
      begin
      StatusLbl.Caption := 'Connesso.' + HHost;
      if not SendBtn.Enabled then
        SendBtn.Enabled := true;
      end
    else
      begin
      StatusLbl.Caption := 'Non connesso.';
      if SendBtn.Enabled then
        SendBtn.Enabled := false;
      end;
    end;
    
    end.

    Client:
    codice:
    var
      Form3: TForm3;
    
    implementation
    
    {$R *.dfm}
    procedure TForm3.AddLog(Text: string);
    begin
    Log.Lines.Add(TimeToStr(Now) + ': ' + Text);
    end;
    
    procedure TForm3.ConnBtnClick(Sender: TObject);
    begin
    if FileExists('local') then
      Client.Host := IP.CurrentIP
    else
      Client.Host := '192.168.0.1';
    Client.Connect;
    end;
    
    procedure TForm3.SendBtnClick(Sender: TObject);
    begin
    Client.Send(IP.currentIP,1717,Cmd.Text);
    end;
    
    procedure TForm3.TimerTimer(Sender: TObject);
    begin
    if Client.Connected then
      begin
      StatusLbl.Caption := 'Connesso' + Client.Host;
      if not SendBtn.Enabled then
        SendBtn.Enabled := true;
      end
    else
      begin
      StatusLbl.Caption := 'Non connesso';
      if SendBtn.Enabled then
        SendBtn.Enabled := false;
      end;
    
    if Client.Binding.Readable(1) then
    
      AddLog(Client.Binding.PeerIP + ' -> ' + Client.ReceiveString());
    
    end;
    end.
    Sia il client che il server funzionano sulla stessa macchina.
    Si connettono correttamente, il Server su CurrentIP:1717 e manda dati su CurrentIP:1718 mentre il Client l'opposto.
    Il problema è che il client invia correttamente al server, ma non avviene il contrario, che cosa ho sbagliato?????

    Aiutatemi x favore, grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    La porta deve essere la stessa per entrambe le applicazioni; il server la utilizza per mettersi in ascolto, il client per inviare dati a quella porta e ricevere la risposta.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    il fatto è che se metto la stessa porta, 1717, il client comunica sempre bene, ma il server si invia i dati da solo! nel senso che la stringa mandata invece di comparire nel memo del client compare nel memo del server... un pò assurdo no? come mai?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il server deve rispondere solamente a richieste provenienti dal client; in mancanza di una richiesta specifica, il server non spedisce alcunché.

    Se ciascuna applicazione invece deve svolgere le stesse funzionalità del client e del server, allora ti serve una coppia di componenti per ciascuna applicazione...anzi, in realtà l'applicazione diventerebbe una sola (che svolge l'uno e l'altro compito).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    ah ho capito! quindi visto che il server dovrà svolgere compiti diversi dal client, ma entrambi devono inviare/ricevere dati, in ogni app creo un TIdUDPServer e un TIdUDPClient, glisto? Se è così, che porte devo settare?? Tutte uguali oppure PortaServerdelServer = PortaClientDelClient e PortaClientDelServer = PortaServerDleClient ??

    grazie

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da gygabyte017
    ah ho capito! quindi visto che il server dovrà svolgere compiti diversi dal client, ma entrambi devono inviare/ricevere dati, in ogni app creo un TIdUDPServer e un TIdUDPClient, glisto? Se è così, che porte devo settare?? Tutte uguali oppure PortaServerdelServer = PortaClientDelClient e PortaClientDelServer = PortaServerDleClient ??
    Imposta una porta differente per ciascuna "direzione" dei messaggi, anche se quell'architettura mi appare un poco oscura.

    Inoltre, non so bene a cosa ti stai dedicando, quindi non posso fornire molte indicazioni a riguardo.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.