Salve a tutti..
sto scrivendo scrivendo un programma che deve rimanere in ascolto sulla porta 1027 di un server che tramite telefono riceve informazioni da altri apparati remoti.Ora quando premo il pulsante di connessione avviene la connessione all'IP e alla porta indicati, verifico che la connessione sia attiva e passo il controllo alla SUB Timer_Tick, la quale se ho ben capito , esegue il codice fino al Timer.Stop. In questo tempo ricevo il flusso dal server, lo decodifico, e lo salvo in un file temporaneo in modo da poterlo leggere subito dopo riga per riga. In questo modo aggiungo le righe come record in un DB di Access alla fina cancello il file temporaneo.
Ora quando premo il pulsante, effettuata la connessione, dovrebbe scaricare i dati dal server e poi rimanere in attesa di altri dati. In realtà mi scarica il primo flusso di dati, poi se il server riceve altre informazioni, quindi il buffer è carico, non avviene più nessuna attività, a meno che non premo nuovamente il pulsante di connessione !!!
Cosa c'è che non va ??
codice:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Call connetti()
End Sub
Public Sub connetti()
Dim AddressIP As String = TextBox1.Text 'Metto l'ip dentro ad AddressIP
Centrale = New TcpClient 'Centrale è un nuovo client
Centrale.Connect(AddressIP, Porta) 'Connetti Centrale all'indirizzo ip indirizzo attraverso la porta xxxx
If Centrale.Connected Then 'Se Centrale è connesso allora... (cioè se il server è in ascolto)
flusso = Centrale.GetStream() 'flusso è l’invio/ricezione (Stream) di dati con il server al quale Centrale è connesso
Timer1.Start() 'Avvio Timer1
Else 'Altrimenti...
TextBox3.Text = TextBox3.Text & "Il server non risponde!" & vbCrLf 'Scrivo in TextBox3
End If 'Fine se
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
On Error Resume Next
Centrale.Close() 'Chiudo la connessione
TextBox3.Text = TextBox3.Text & "Il server è disconnesso!" & vbCrLf 'Scrivo in TextBox3
x = 0
'Timer1.Stop()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = Str(x)
If Centrale.Connected Then
ToolStripStatusLabel1.Text = "Connesso al Server: " & TextBox1.Text & " sulla porta:" & TextBox2.Text
If Centrale.Available > 0 Then 'Se i dati che ricevi dal server al quale è connesso Centrale sono disponibili e sono maggiori di 0
x = x + 1
ToolStripStatusLabel1.Text = "...ricezione dati..."
Dim temp(Centrale.Available - 1) As Byte 'Dichiaro un array con dimensioni uguali al numero di dati ricevuti da Centrale meno 1
flusso.Read(temp, 0, temp.Length) 'Leggo il flusso di dati
Dim testo As String = UTF8.GetString(temp) 'Decodifica temp in stringa UTF8 e mettila in testo
My.Computer.FileSystem.WriteAllText(FileTMP, testo & vbCrLf, True) ' scrivo sul file l'output della centrale
TextBox3.Text = TextBox3.Text & My.Computer.FileSystem.ReadAllText(FileTMP) ' leggo dal file e popolo la TextBox
If File.Exists(FileTMP) Then
Dim oRead As System.IO.StreamReader
Dim stringasql As String
ConnessioneDB.Open() ' Apro la connessione al DB
oRead = File.OpenText(FileTMP) ' Leggo il contenuto del file di testo
While oRead.Peek <> -1
testo = oRead.ReadLine ' Leggo una riga per volta del file di testo
If Len(testo) > 0 Then ' se la riga non è vuota la scrivo nel DB
stringasql = "Insert into Flusso(Messaggio) values('" & testo & "')"
Comando = New OleDbCommand(stringasql, ConnessioneDB)
Comando.ExecuteNonQuery()
End If
End While
oRead.Close() ' chiudo il file di testo
ConnessioneDB.close() ' chiudo la connessione al DB
File.Delete(FileTMP) ' cancello il file di testo
End If
End If ' Fine se
Else
ToolStripStatusLabel1.Text = "Disconnesso"
Timer1.Stop()
End If
'Centrale.Close()
End Sub
grazie a tutti