Oppure

Loading
23/11/09 16:46
oretovalley
Ciao a tutti stavo, studiando la guida scritta da Totem's Lair(colgo l'occasione per ringraziarlo perchè è fatta benissimo), tornando al mio problema non riesco a capire perchè non riesco a far dialogare server e client, ho seguito perfettamente la guida postata creando per il server un form con una textbox, 2 timer e un button con questo codice:

Imports System.Net.Sockets

Public Class Form1

    Public Client As TcpClient
    Public NetStr As NetworkStream

    Public Listener As New TcpListener(25)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Esiste anche una versione di Start che accetta come parametro
        'il massimo numero di connessioni accettabili
        Listener.Start()


    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Se il client è connesso
        If Client.Connected Then
            'Se si può scrivere sullo stream
            If NetStr.CanWrite Then
                'Converte il messaggio in bytes
                Dim Bytes() As Byte = _
                System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox1.Text)
                'E li scrive sullo stream
                NetStr.Write(Bytes, 0, Bytes.Length)
            End If
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Listener.Pending Then
            'Inizializza il client
            Client = Listener.AcceptTcpClient
            'Inizializza lo stream
            NetStr = Client.GetStream
            'Termina il controllo del timer
            Timer1.Stop()
            'Termina l'ascolto del TcpListener
            Listener.Stop()
            'Attiva il timer per la ricezione di dati
            Timer2.Start()
        End If
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        'Se il client è connesso
        If Client.Connected Then
            'Se ci sono dati da leggere, che possono essere letti
            If Client.Available > 0 And NetStr.CanRead Then
                'Legge i dati come array di bytes
                Dim Bytes(Client.ReceiveBufferSize) As Byte
                'Legge Client.ReceiveBufferSize bytes a partire dal primo
                'dallo stream e li deposita in Bytes
                'se ci sono bytes nulli, non verranno contati
                'di default, Client.ReceiveBufferSize = 8129
                NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)

                'Trasforma i bytes ricevuti in stringa
                Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
                'Visualizza il messaggio
                MsgBox(S, MsgBoxStyle.Information)
            End If
        End If

    End Sub
End Class


Nel client ho creato due button e una textbox e un timer con questo codice:

Imports System.Net.Sockets

Public Class Form1

    Public Client As TcpClient
    Public NetStr As NetworkStream


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Se il client è connesso
        If Client.Connected = True Then
            'Se si può scrivere sullo stream
            If NetStr.CanWrite Then
                'Converte il messaggio in bytes
                Dim Bytes() As Byte = _
                System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox1.Text)
                'E li scrive sullo stream
                NetStr.Write(Bytes, 0, Bytes.Length)
            End If
        End If

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Se il client è connesso
        If Client.Connected Then
            'Se ci sono dati da leggere, che possono essere letti
            If Client.Available > 0 And NetStr.CanRead Then
                'Legge i dati come array di bytes
                Dim Bytes(Client.ReceiveBufferSize) As Byte
                'Legge Client.ReceiveBufferSize bytes a partire dal primo
                'dallo stream e li deposita in Bytes
                'se ci sono bytes nulli, non verranno contati
                'di default, Client.ReceiveBufferSize = 8129
                NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)

                'Trasforma i bytes ricevuti in stringa
                Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
                'Visualizza il messaggio
                MsgBox(S, MsgBoxStyle.Information)
            End If
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        'Prova a connettersi al server
        Client.Connect("127.0.0.1", 25)
        'Se è avvenuta la connessione
        If Client.Connected = True Then
            'Inizializza lo stream
            NetStr = Client.GetStream
        End If
    End Sub
End Class


ma non riescono a dialogare ora mi chiedo dov'è l'errore?
aaa
24/11/09 15:45
Il Totem
In teoria dovrebbe funzionare... Ma dovresti essere più preciso: non riescono a dialogare perchè? Si blocca il client sul tentativo di connessione? Il client risulta connesso, invia del testo, ma il server sembra non riceverlo? E in questo caso, hai controllato che la richiesta sia effettivamente arrivata al server (seppure sulla stessa macchina)? Mi sembra strano...
aaa
26/11/09 8:41
oretovalley
ho risolto, i timer non erano avviati :)
aaa
26/11/09 16:45
Il Totem
:rotfl:
aaa
30/11/09 15:55
oretovalley
in questi giorni sto effettuando moltissimi test, con ottimi risultati direi con i socket, ma non riesco a capire perchè se apro il Server e il Client riesco a dialogare perfettamente, ma se chiudo e riapro il Client non riesco più a dialogare con il Server perchè secondo voi?
aaa
01/12/09 15:58
Il Totem
'Termina l'ascolto del TcpListener
Listener.Stop() 

:yup:
aaa
22/03/10 11:02
nala84
Ciao sto utilizzando il tuo codice... e funziona alla perfezione!! :asd:

Solo che vorrei che i byte ricevuti fossero visualizzati tutti in una casella di testo
Facendo così:

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        'Se il client è connesso
        If Client.Connected Then
            'Se ci sono dati da leggere, che possono essere letti
            If Client.Available > 0 And NetStr.CanRead Then
                'Legge i dati come array di bytes
                Dim Bytes(Client.ReceiveBufferSize) As Byte
                'Legge Client.ReceiveBufferSize bytes a partire dal primo
                'dallo stream e li deposita In Bytes
                'se ci sono bytes nulli, non verranno contati
                'di Default, Client.ReceiveBufferSize = 8129
                NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)

                'Trasforma i bytes ricevuti In stringa
                Dim S As Object = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
                'Visualizza il messaggio
                'MsgBox(S, MsgBoxStyle.Information)

                Text2.Text = "[Ricezione dati]" & S & vbCrLf & vbCrLf & Text1.Text
                'Text2.Text = S + S
            End If
        End If

    End Sub


Memorizza solo l'ultimo dato ricevuto....
Come posso fare??
aaa
22/03/10 11:45
nala84
Ho risolto!!
aaa