carant (Normal User)
Pro
Messaggi: 69
Iscritto: 08/11/2009
|
Questo topic è stato chiuso dal moderatore Ciao a tutti,
Ciao a tutti,
sto cercando di inviare stringhe tramite un networkstream ma mi dà un errore...
Riporto il codice:
codice:
Codice sorgente - presumibilmente VB.NET |
Dim stream As NetworkStream stream = client.GetStream() If stream.CanRead Then Dim c(client.ReceiveBufferSize) As Byte Dim size = c.Length stream.Read(c, 0, size) End If
|
Naturalmente prima c'è una procedura per la connessione...
Dice che il flusso di informazioni non supporta funzioni di ricerca(su stream.canread)...
che devo fare??
Ciao.
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Strano, di solito quell'eccezione viene generata in altri casi, come, ad esempio, l'uso della proprietà Position o Length o del metodo Seek. Sei sicuro che sia proprio quella linea?
|
|
carant (Normal User)
Pro
Messaggi: 69
Iscritto: 08/11/2009
|
Veramente adesso non mi dà più errori: si blocca il programma e tutto visual basic..
Se per te il codice va bene forse è il mio pc e quindi vado avanti.
Posto tutta la procedura:
Codice sorgente - presumibilmente VB.NET |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click client = New TcpClient("127.0.0.1", 25) If client.Connected Then ToolStripStatusLabel1.Text = "Connessione stabilita" Dim stream As NetworkStream stream = client.GetStream() If stream.CanRead Then Dim c(client.ReceiveBufferSize) As Byte Dim size As Integer = c.Length stream.Read(c, 0, size) End If End If End Sub
|
Ciao.
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Devi aspettare che si connette, quindi... non si è bloccato.
Ultima modifica effettuata da Il Totem il 10/11/2009 alle 12:37 |
|
carant (Normal User)
Pro
Messaggi: 69
Iscritto: 08/11/2009
|
Quando si deve connettere mi esce subito il messaggio "Connesso"...
Forse è perchè l'oggetot stream non è mai stato creato.. se io scrivo stream=client.getstream() ho creato l'oggetto?? o devo usare new?? perchè se è così mi chiede il socket e devo cambiare tutto, dovrei connettere due computer con il socket...
(è la prima volta che scrivo networking)!!!
Dimmi come devo fare...
ciao.
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Nono stai facendo confusione. Tu non ti devi preoccupare di creare l'oggetto, altrimenti GetStream sarebbe totalmente inutile, non ti pare? L'inizializzazione con New serve per creare una nuova istanza di un oggetto, è vero, ma in questo caso c'è qualcun altro che la crea per noi, ossia la funzione GetStream. Se l'oggetto non fosse esistito avresti ricevuto un'eccezione di tipo NullReferenceException.
Lo stream esiste, ma la connessione può non essere sempre istantanea, quindi ti suggerisco di usare dei breakpoint per controllare dove l'esecuzione si blocca. E poi non hai postato il codice del server: magari l'errore è lì.
|
|
carant (Normal User)
Pro
Messaggi: 69
Iscritto: 08/11/2009
|
Non so cosa sia un breakpoint, quindi posto il codice del server:
CLIENT:
Codice sorgente - presumibilmente VB.NET |
Private client As TcpClient Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click client = New TcpClient("127.0.0.1", 25) If client.Connected Then ToolStripStatusLabel1.Text = "Connessione stabilita" Dim stream As NetworkStream stream = client.GetStream() If stream.CanRead Then Dim c(client.ReceiveBufferSize) As Byte Dim size As Integer = c.Length stream.Read(c, 0, size) Dim msg msg = stream.Read(c, 0, size) Dim msgdascrivere As String msgdascrivere = System.Text.Encoding.ASCII.GetChars(msg) TextBox1.Text = msgdascrivere End If End If End Sub
|
SERVER:
Codice sorgente - presumibilmente VB.NET |
Public listener As TcpListener = New TcpListener(25) Private client As TcpClient = New TcpClient() Public stream As NetworkStream Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick listener.Start() If listener.Pending Then Timer1.Stop() client = listener.AcceptTcpClient() listener.Stop() End If If client.Connected Then stream = client.GetStream() Dim msg msg = System.Text.Encoding.ASCII.GetBytes("ciao") stream.Write(msg, 0, msg.length) End If End Sub
|
|
|
Gianluca87 (Ex-Member)
Expert
Messaggi: 300
Iscritto: 16/11/2008
|
oddio...un socket in mano a un timer...
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Ma tu stai richiamando Start tante volte quante i tick del timer, ossia ogni decimo di secondo gli dici di iniziare a mettersi in ascolto: è inutile e assurdo, basta una sola volta.
E poi perchè inizializzi il tcpclient? Non ti serve inizializzarlo, perchè l'unico modo che hai di riceverne un'istanza valida è attraverso listener.AcceptTcpClient.
Dato che hai una certa ossessione per i costruttori, è sempre meglio NON inizializzare una variabile di tipo reference, ma solo dichiararla. La si inizializza poco prima dell'uso, e la si distrugge appena terminato di usarla.
|
|