CODICE DEL FORM CONTROLLO SCHERMO
Codice sorgente - presumibilmente VB.NET
codice:
Imports System.Net.Sockets
Imports System.Text.ASCIIEncoding
Imports System.IO
Public Class controllo_schermo
Dim x As Integer = ApRev.ListView1.SelectedItems(0).SubItems(1).Text
Dim id As Integer = ApRev.ListView1.SelectedItems(0).SubItems(6).Text
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
sendok()
End Sub
Private Sub sendok()
Dim temp() As Byte = ASCII.GetBytes("startsend")
ApRev.flusso(x).Write(temp, 0, temp.Length)
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim Stream As New IO.FileStream("Z:\Users\Hakzc\Documents\io.gif", IO.FileMode.Create)
Do
If ApRev.dskcliente(id).Available Then
Dim Bytes(4096) As Byte
ApRev.dskflusso(id).Read(Bytes, 0, 4096)
Stream.Write(Bytes, 0, 4096)
System.Threading.Thread.Sleep(10)
dim msg As String = ASCII.GetString(Bytes)
If msg.Contains("END2") Then
Exit Do
End If
End If
Loop
BackgroundWorker1.Dispose()
BackgroundWorker1.CancelAsync()
Stream.Close()
PictureBox1.ImageLocation = "Z:\Users\Hakzc\Documents\io.gif"
sendok()
End Sub
End Class
APREV(FORM PRINCIPALE)
TIMER4 E BUTTON 5
Codice sorgente - presumibilmente VB.NET
codice:
Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
If dskservitore.Pending() Then
Timer4.Stop()
Array.Resize(dskcliente, dskcliente.Length + 1)
dskcliente(dskcliente.Length - 1) = dskservitore.AcceptTcpClient()
Array.Resize(dskflusso, dskflusso.Length + 1)
dskflusso(dskflusso.Length - 1) = dskcliente(dskcliente.Length - 1).GetStream()
For r = 0 To UBound(dskcliente)
ListView1.SelectedItems(0).SubItems(6).Text = r.ToString
Next
controllo_schermo.Show()
Timer4.Start()
End If
End Sub
e del button per attivare la connessione
Codice sorgente - presumibilmente VB.NET
codice:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
dskservitore = New TcpListener(599)
dskservitore.Start()
Timer4.Start()
Button5.BackColor = Color.Green
End Sub
Il programma è una specie di desktop remoto(x scopi legali credetemi),
Praticamente cliccando sul button5 si apre la connessione e viene avviato il timer4 che controlla le connessioni in entrata, successivamente cliccando su un altro bottone (che non ho messo perchè non serve) il client attraverso un altro flusso dati/porta invia un messaggio al server, così il server si connette e quando il client riceve la richiesta di connessione la accetta ed apre controllo schermo.
Cliccando sul bottone presente sul form controllo schermo il client invia un messaggio (dalla porta principale, non dalla porta del trasferimento immagini) al server dicendo di iniziare ad inviare le immagini ed apre backgroundworker, il server conteporaneamente prende uno screen dello schermo, lo salva e lo invia a pacchetti tramite timer, ricevuto lo screen il form controllo schermo dovrebbe farlo apparire sulla picturebox e poi inviare una nuova richiesta per la ricezione di un nuovo screen.
Il punto è che se uso i timer in entrambi i lati è apposto e funziona (però spostando l'applicazione client va a scatti a spostarsi e per premere un button ci mette 3 secondi) se provo con un backgroundworker nel client mi dice indice oltre i limiti della matrice su questo pezzo di codice: If ApRev.dskcliente(id).Available Then
premetto che l'array non è vuota, e funziona tutto con i timer. Lo stesso errore anche se metto in entrambi i lati i backgroundworker. Perchè? Ho provato ad inserire il backgroundworker sul form principale (aprev) e funziona e riceve le immagini, come mai allora sul form controllo_schermo con lo stesso codice mi dice indice oltre i limiti della matrice?
(l'array non è vuota)
Il backgroundworker deve perforza essere sul form controllo_schrmo (secondario)