Oppure

Loading
23/12/09 15:41
Ciccioo
Salve, leggendo la guida di Totem al vb.net, e arrivando al capitolo dei socket con esempio di una semplice (-.-) chat, ho voluto provare anche io a costruirne una, ma ho incontrato dei problemi:

in rete: non riesco a connettere server a client, ma questo credo sia un problema di antivirus/firewall o simili, quello che mi affligge è l'altro

in locale: client e server si collegano, ho fatto la prova del 9 col netstat, ma non riesco a mandare messaggi dall' uno all' altro, ho anche notato che in qualsiasi momento lo controlli, client.available è sempre e comunque uguale a 0...

illuminatemi, questo è il codice del server...

Imports System.Net.Sockets

Public Class Form1

    Public Client As New 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
        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 e ci si può scrivere
        If Client.Connected and 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 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    'PROBLEMA: client.avaible è perennemente 0 quindi la condizione è sempre falsa e non legge mai niente...
                '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


...e questo quello del client...

Imports System.Net.Sockets

Public Class Form1

    Public Client As New 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)
        Timer1.Enabled = True
        'Se è avvenuta la connessione
        If Client.Connected = True Then
            'Inizializza lo stream
            NetStr = Client.GetStream
        End If
        Button2.Enabled = False
        If Client.Connected = True Then
            MsgBox("Complimenti!")
        End If
    End Sub
End Class


grazie :k:
aaa
23/12/09 15:42
Daniele93
Aspetto anche io risposte perchè lavoriamo in 2...
aaa