Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Dubbi Socket
Forum - C# / VB.NET - [VB.NET] Dubbi Socket

Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 17:46
Lunedì, 23/11/2009
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:

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net.Sockets
  2.  
  3. Public Class Form1
  4.  
  5.     Public Client As TcpClient
  6.     Public NetStr As NetworkStream
  7.  
  8.     Public Listener As New TcpListener(25)
  9.  
  10.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  11.         'Esiste anche una versione di Start che accetta come parametro
  12.         'il massimo numero di connessioni accettabili
  13.         Listener.Start()
  14.  
  15.  
  16.     End Sub
  17.  
  18.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  19.         'Se il client è connesso
  20.         If Client.Connected Then
  21.             'Se si può scrivere sullo stream
  22.             If NetStr.CanWrite Then
  23.                 'Converte il messaggio in bytes
  24.                 Dim Bytes() As Byte = _
  25.                 System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox1.Text)
  26.                 'E li scrive sullo stream
  27.                 NetStr.Write(Bytes, 0, Bytes.Length)
  28.             End If
  29.         End If
  30.     End Sub
  31.  
  32.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  33.         If Listener.Pending Then
  34.             'Inizializza il client
  35.             Client = Listener.AcceptTcpClient
  36.             'Inizializza lo stream
  37.             NetStr = Client.GetStream
  38.             'Termina il controllo del timer
  39.             Timer1.Stop()
  40.             'Termina l'ascolto del TcpListener
  41.             Listener.Stop()
  42.             'Attiva il timer per la ricezione di dati
  43.             Timer2.Start()
  44.         End If
  45.     End Sub
  46.  
  47.     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
  48.         'Se il client è connesso
  49.         If Client.Connected Then
  50.             'Se ci sono dati da leggere, che possono essere letti
  51.             If Client.Available > 0 And NetStr.CanRead Then
  52.                 'Legge i dati come array di bytes
  53.                 Dim Bytes(Client.ReceiveBufferSize) As Byte
  54.                 'Legge Client.ReceiveBufferSize bytes a partire dal primo
  55.                 'dallo stream e li deposita in Bytes
  56.                 'se ci sono bytes nulli, non verranno contati
  57.                 'di default, Client.ReceiveBufferSize = 8129
  58.                 NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
  59.  
  60.                 'Trasforma i bytes ricevuti in stringa
  61.                 Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
  62.                 'Visualizza il messaggio
  63.                 MsgBox(S, MsgBoxStyle.Information)
  64.             End If
  65.         End If
  66.  
  67.     End Sub
  68. End Class



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

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net.Sockets
  2.  
  3. Public Class Form1
  4.  
  5.     Public Client As TcpClient
  6.     Public NetStr As NetworkStream
  7.  
  8.  
  9.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  10.         'Se il client è connesso
  11.         If Client.Connected = True Then
  12.             'Se si può scrivere sullo stream
  13.             If NetStr.CanWrite Then
  14.                 'Converte il messaggio in bytes
  15.                 Dim Bytes() As Byte = _
  16.                 System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox1.Text)
  17.                 'E li scrive sullo stream
  18.                 NetStr.Write(Bytes, 0, Bytes.Length)
  19.             End If
  20.         End If
  21.  
  22.     End Sub
  23.  
  24.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  25.         'Se il client è connesso
  26.         If Client.Connected Then
  27.             'Se ci sono dati da leggere, che possono essere letti
  28.             If Client.Available > 0 And NetStr.CanRead Then
  29.                 'Legge i dati come array di bytes
  30.                 Dim Bytes(Client.ReceiveBufferSize) As Byte
  31.                 'Legge Client.ReceiveBufferSize bytes a partire dal primo
  32.                 'dallo stream e li deposita in Bytes
  33.                 'se ci sono bytes nulli, non verranno contati
  34.                 'di default, Client.ReceiveBufferSize = 8129
  35.                 NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
  36.  
  37.                 'Trasforma i bytes ricevuti in stringa
  38.                 Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
  39.                 'Visualizza il messaggio
  40.                 MsgBox(S, MsgBoxStyle.Information)
  41.             End If
  42.         End If
  43.     End Sub
  44.  
  45.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  46.         'Prova a connettersi al server
  47.         Client.Connect("127.0.0.1", 25)
  48.         'Se è avvenuta la connessione
  49.         If Client.Connected = True Then
  50.             'Inizializza lo stream
  51.             NetStr = Client.GetStream
  52.         End If
  53.     End Sub
  54. End Class



ma non riescono a dialogare ora mi chiedo dov'è l'errore?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:45
Martedì, 24/11/2009
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...


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 9:41
Giovedì, 26/11/2009
ho risolto, i timer non erano avviati :)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:45
Giovedì, 26/11/2009
:rotfl:


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 16:55
Lunedì, 30/11/2009
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?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:58
Martedì, 01/12/2009
Codice sorgente - presumibilmente C# / VB.NET

  1. 'Termina l'ascolto del TcpListener
  2. Listener.Stop()


:yup:


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
nala84 (Normal User)
Newbie


Messaggi: 13
Iscritto: 18/03/2008

Segnala al moderatore
Postato alle 12:02
Lunedì, 22/03/2010
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ì:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
  2.         'Se il client è connesso
  3.         If Client.Connected Then
  4.             'Se ci sono dati da leggere, che possono essere letti
  5.             If Client.Available > 0 And NetStr.CanRead Then
  6.                 'Legge i dati come array di bytes
  7.                 Dim Bytes(Client.ReceiveBufferSize) As Byte
  8.                 'Legge Client.ReceiveBufferSize bytes a partire dal primo
  9.                 'dallo stream e li deposita In Bytes
  10.                 'se ci sono bytes nulli, non verranno contati
  11.                 'di Default, Client.ReceiveBufferSize = 8129
  12.                 NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
  13.  
  14.                 'Trasforma i bytes ricevuti In stringa
  15.                 Dim S As Object = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
  16.                 'Visualizza il messaggio
  17.                 'MsgBox(S, MsgBoxStyle.Information)
  18.  
  19.                 Text2.Text = "[Ricezione dati]" & S & vbCrLf & vbCrLf & Text1.Text
  20.                 'Text2.Text = S + S
  21.             End If
  22.         End If
  23.  
  24.     End Sub



Memorizza solo l'ultimo dato ricevuto....
Come posso fare??

PM Quote
Avatar
nala84 (Normal User)
Newbie


Messaggi: 13
Iscritto: 18/03/2008

Segnala al moderatore
Postato alle 12:45
Lunedì, 22/03/2010
Ho risolto!!

PM Quote
Avatar
nala84 (Normal User)
Newbie


Messaggi: 13
Iscritto: 18/03/2008

Segnala al moderatore
Postato alle 17:52
Lunedì, 22/03/2010
Ciao!!
Ho un altro problema con le socket!!
in pratica dovrei aggiungere un evento quando la socket si disconnette!!
Questo è il codice in vb6 di quello che dovrei fare!!
Codice sorgente - presumibilmente VB.NET

  1. Private Sub w1_Close()
  2. Dim PsStart As Long
  3. Dim PsEOF As Long
  4. PsStart = InStr(1, DatiStampa, "%!PS")
  5. PsEOF = InStr(1, DatiStampa, "%%EOF")
  6.  
  7. DatiStampa = Mid(DatiStampa, PsStart, Len(DatiStampa) - PsStart + 5)
  8. w1.Close
  9. Open "c:\test.ps" For Append As #1
  10. Print #1, , DatiStampa;
  11.  
  12. ' Chiude prima di riaprire in una modalità diversa.
  13. Close #1
  14. Form2.Show 1
  15. Call ConvertFile
  16. Kill "c:\test.ps"
  17. DatiStampa = ""
  18. DatiIntestazione = ""
  19. SwitchDati = False
  20. w1.Listen
  21. End Sub


Dove w1 è la socket
Come posso farlo in vb.net??

PM Quote