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...
...e questo quello del client...
grazie
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
aaa