Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    6

    [vb 2010 net] TcpClient Asincrono

    Ciao a tutti sono nuovo del forum ma vi seguo spesso per utili informazioni a riguardo.
    Non voglio fare perdere troppo tempo a nessuno essendo un novizio sull'utilizzo su questo software ma ho un progetto ambizioso che mi piacerebbe riuscire a fare imparando (Mi sono già guardato un pò di tutorial in merito ma ovviamente non si impara a scrivere codici dalla sera alla mattina.

    Il mio progetto è questo:

    Dovrei creare a regime un programma (l'ho già fatto in parte ma ho delle mancanze di teoria e pratica) un TcpClient che tramite una GUI inserendo indirizzo ip e porta tcp realizzi una connessione con un server che è sempre in ascolto (è nel mio caso un centralino telefonico che è sempre in ascolto sulla porta 5100 e manda righe di testo una dopo l'altra già formattata) ma dal mio client devo solo ricevere queste righe e non inviare nulla e generare un TXT che si aggiorna in automatico ogni volta che il server gli passa una riga o più righe.
    Ho già provato a fare ciò solo che, se non mi sbaglio il mio stream di dati è sempre attivo e ho in pochi minuti un file di testo enorme e anche in parte non formattato correttamente.
    Servirebbe che quando dalla GUI faccio connetti rimanesse in background tipo nella barra dell'orario e aprisse lo stream solo quando il server (il centralino spedisce le righe relative al dettaglio chiamate de derivati) e in ogni caso intervenire aprendo la GUI e interrompere l'acquisizione per poi rilanciarla eventualmente.
    So di essere troppo esigente, ma il mio scopo non è solo realizzare questo ma poi collegarmo ad altre applicazioni tipo leggere file txt e incasellarlo in un DB ma sopratutto imparare. Grazie se potete aiutarmi.. magari posso farviu vedere il mio CODICE.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    6

    Codice errato

    Vi allego il mio codice errato. GRAZIE
    -----------------------------------------------------------------------

    codice:
    Imports System.Net.Sockets
    Imports System.Text
    Imports System.IO
    
    Public Class frmPabx
    
        Dim cliente As TcpClient 'Variabile client
        Dim flusso As NetworkStream 'Variabile flusso di dati client-server
    
        Private Sub frmPbx_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub btnConnetti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnetti.Click
    
            Dim indirizzo As String = txtIP.Text 'Metto l'ip dentro ad Indirizzo IP
            Dim porta As String = txtPorta.Text
    
            cliente = New TcpClient 'cliente è un nuovo client
            cliente.Connect(indirizzo, porta) 'Connetti cliente all'indirizzo ip indirizzo attraverso la porta
    
            Dim flusso As NetworkStream = cliente.GetStream() 'flusso è l’invio/ricezione (Stream) di dati con il server al quale cliente è connesso
                         
            If flusso.CanRead Then
                'Reads the NetworkStream into a byte buffer.
                Dim bytes(cliente.ReceiveBufferSize) As Byte
                ' Read can return anything from 0 to numBytesToRead. 
                ' This method blocks until at least one byte is read.
    
                Dim oWrite As System.IO.StreamWriter
                oWrite = IO.File.CreateText("C:\sample.txt")
    
                While (True)
    
                    flusso.Read(bytes, 0, CInt(cliente.ReceiveBufferSize))
    
                    ' Returns the data received from the host to the console.
                    Dim returndata As String = Encoding.ASCII.GetString(bytes)
                    Console.WriteLine(("This is what the host returned to you: " + returndata))
                    oWrite.WriteLine(returndata)
                End While
    
            Else
                Console.WriteLine("You cannot read data from this stream.")
                cliente.Close()
                ' Closing the tcpClient instance does not close the network stream.
                flusso.Close()
                Return
            End If
            Me.Close()
    
        End Sub
    
        Private Sub btnAnnulla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnnulla.Click
    
        End Sub
    End Class

  3. #3
    Ti ho editato il messaggio, aggiungendo i tag [ code ] e [/ code ] (senza spazi). La prossima volta che posti del codice ti invito ad usare questo tag, che rende il codice molto più leggibile. Ciao
    Chi non cerca trova.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    6
    Ok grazie, non succederà più.
    Qualcuno riesce a darmi una "spinta" al mio progetto??

    Grazie.

  5. #5
    Ciao.
    Prova a sostiruire questa riga di codice
    codice:
    If flusso.CanRead Then
    con questa
    codice:
    If cliente.Available > 0 Then
    ed a fare le modifiche del caso.

    Poi l'Array di Byte lo dimensionerei con il valore di cliente.Available.

    Facci sapere...
    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    6
    Ciao, pensi che in questo modo possa funzionare?

    codice:
    Imports System.Net.Sockets
    Imports System.Text
    Imports System.IO
    Imports System.Net.Sockets.TcpClient
    Imports System.Windows.Forms.Timer
    
    
    Public Class frmPabx
    
    
        Dim client As TcpClient 'Variabile client
        Dim stream As NetworkStream 'Variabile stream di dati client-server
    
        Private Sub frmPbx_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub btnConnetti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnetti.Click
    
            Dim indirizzo As String = txtIP.Text 'Metto l'ip dentro ad Indirizzo IP
            Dim porta As String = txtPorta.Text 'Metto la porta TCP a porta
    
            client = New TcpClient 'cliente è un nuovo client
            client.Connect(indirizzo, porta) 'Connetti cliente all'indirizzo ip attraverso la porta tcp
    
            Dim stream As NetworkStream = client.GetStream() 'flusso è l’invio/ricezione(Stream)di dati con il server.
            Dim Write As System.IO.StreamWriter
            Write = IO.File.CreateText("C:\recorder.txt") 'Crea il file txt.
    
            ' Examples for CanRead, Read, and DataAvailable.
            ' Check to see if this NetworkStream is readable.
            If stream.CanRead Then
                Dim myReadBuffer(1024) As Byte
                Dim myCompleteMessage As StringBuilder = New StringBuilder()
                Dim numberOfBytesRead As Integer = 0
    
                ' Incoming message may be larger than the buffer size.
                Do
                    numberOfBytesRead = stream.Read(myReadBuffer, 0, CInt(myReadBuffer.Length))
                    myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead))
                Loop While stream.DataAvailable
    
                ' Print out the received message to the console.
                Console.WriteLine(("You received the following message : " + myCompleteMessage.ToString()))
            Else
                Console.WriteLine("Sorry.  You cannot read from this NetworkStream.")
            End If
    
            Return
    
        End Sub
    Pensi che il file txt venga compilato correttamente?
    Pensi che creare un timer per rimpetere ad intervalli il mio ciclo possa essere giusto?
    Se si, come lo posso usare all'interno del mio evento click?
    (ti ricordo che io devo solamente ricevere righe di testo da un server e riaprire e chiudere il file txt solo quando il server mi invia la/le righe.
    Grazie tante.

  7. #7
    Ciao, pensi che in questo modo possa funzionare?
    No .... perche CanRead sarà sempre true
    Pensi che il file txt venga compilato correttamente?
    No .... perchè non vedo nessun codice per la scrittura nel file
    Pensi che creare un timer per rimpetere ad intervalli il mio ciclo possa essere giusto?
    No ... preferisco un thread separato con un loop infinito.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    6
    Ciao, ho cercato di comprendere per lo meno un pò di teoria in MSDN e ho riscritto il codice.
    Riuscite a capire se può essere (per lo meno per iniziare) scritto correttamente?
    Mi blocco sulla scrittura del mio stream ricevuto/convertito nel mio "smdr.txt" creato in precedenza: non riesco a formulare un riga che mi permetta di scrivere i dati sul txt e fare in modo che venga chiuso e aperto all'occorrenza (append?) per fare in modo che possa essere aperto/collegato ad access.
    codice:
    Dim Client As New TcpClient  'dichiaro nuovo client              
      Dim stream As NetworkStream  'dichiaro nuovo stream
    
      Dim indirizzo As String = txtIP.Text  'Metto l'ip dentro ad Indirizzo IP.
      Dim porta As String = txtPorta.Text    'Metto la porta TCP a porta.
    
          client = New TcpClient  'client è un nuovo client.
          client.Connect(indirizzo, porta) 'Connetto client all'indirizzo ip attraverso la porta tcp.  
       
      Dim stream As NetworkStream = client.GetStream()  'stream è l’invio/ricezione dati con il server.
      
    
          If stream.CanRead Then > 0  'se i dati leggibili e sono > di 0
      Dim Writer As System.IO.StreamWriter
    
          Writer = IO.File.CreateText("C:\smdr.txt")  'Creo il file txt dentro il percorso inserito.
    
      Dim Buffer(1024) As Byte
      Dim ReturnData As String = UTF8.GetString(Buffer)
      Dim BytesRead As Integer = 0
    
          Do
          
            BytesRead = stream.Read(Buffer, 0, Buffer.Length)
            ReturnData.AppendFormat("{0}", Encoding.UTF8.GetString(Buffer, 0, BytesRead))
    
            ?? 'come faccio per scrivere il ReturnData nel txt creato mettendolo in append??
    
          Loop While stream.DataAvailable  'ripeto il loop affinchè i dati sono accessibili.
    
    Else
       Console.WriteLine("Spiacente, non puoi leggere i dati!!")
    End If
    Ringrazio tutti per l'aiuto se potete.

  9. #9
    Ciao
    Sinceramente ... io non lo avrei impostato il codice così.... però funziona e quindi potrebbe anche andar bene.

    Per quanto riguarda la scrittura nel file, invece, hai già creato l'oggetto necessario alla scrittura dei dati nel file.
    Ti manca solo
    codice:
    Writer.write
    o
    Write.WriteLine

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    6
    Ciao, grazie sempre per la disponibilità.
    Sai oggi c'ero arrivato a scriverlo (per la mia scarsa conoscenza) ma non sapevo se dovevo scriverci dopo qualcosa oppure no.
    Quindi è sufficiente scriverlo dove ho messo io la frase con i ?? senza nulla dopo?
    Dal tuo punto di vista del codice scritto, pensi che come nel codice che avevo scritto precedentemnte, si possa verificare che il mio txt diventi enorme dopo pochissimo anche senza dati oppure ho risolto col ciclo?

    Per pura curiosità, avresti usato un altro ciclo o avresti usato diversamente DataAvailable?
    Se posso vorrei migliorarlo sempre di più!
    Grazie tante!!!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.