1 2 3 4 5 | Dim data As String Winsock.GetData(data) Receivebox.text = Receivebox.text & data & vbCrLf End Sub |
1 2 3 4 5 6 7 8 9 | Dim networkStream As Net.Sockets.NetworkStream = tcpClient.GetStream() Dim bytes(tcpClient.ReceiveBufferSize) As Byte Dim myReadBuffer(1024) As Byte Dim myCompleteMessage As System.Text.StringBuilder = New System.Text.StringBuilder() Dim numberOfBytesRead As Integer = 0 numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length) RichTextBox2.Text = RichTextBox2.Text & numberOfBytesRead.ToString End Sub |
Ik gebruik Visual Studio 2005 Express Edition met het .NET framework die je daarbij installeert.quote:Op vrijdag 27 februari 2009 23:14 schreef TallMan het volgende:
Even voor de volledigheid, welke versie .NET gebruik je ?
Dat klopt. Dat is bij deze barcodescanner ook het geval. Wanneer ik de juiste string met data verzend krijg ik als respons de gewenste data terug. Met behulp van Wireshark (een programmatje waarmee je data verkeer op je ethernet kaart monitort) zie ik dat de gewenste data ook verzonden wordt. Waarschijnlijk zit er dus iets fout in de VB code.quote:Op zondag 1 maart 2009 19:42 schreef Tuvai.net het volgende:
Als jij er 100% zeker van bent dat jou code werkt, dan zou ik de documentatie van het betreffende apparaat eens daar bij pakken. Veel hardware/apparaten waar softwarematig mee gecommuniceerd kan worden (althans waar ik mee gewerkt heb, voornamelijk modbus-pollers e.d.) hebben er een eigen beveiliging op na. Wat ik al heel vaak tegen ben gekomen bij dergelijke apparaatjes, is dat je eerst een code/commando moet sturen, alvorens je data geretourneerd kunt krijgen.
1 2 3 4 5 6 7 8 9 10 | Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim networkStream As Net.Sockets.NetworkStream = tcpClient.GetStream() If networkStream.CanWrite And networkStream.CanRead Then ' Do a simple write. Dim sendBytes As [Byte]() = System.Text.Encoding.ASCII.GetBytes(TextBox1.Text) networkStream.Write(sendBytes, 0, sendBytes.Length) RichTextBox1.Text = RichTextBox1.Text & TextBox1.Text End If End Sub |
Dan zou ik toch denken non-blockingquote:This method reads data into the buffer parameter and returns the number of bytes successfully read. If no data is available for reading, the Read method returns 0.
Toch maar even naar de DataAvailable property van je networkstream kijken, eventueel icm een timertje om em op je scherm te updaten.quote:Use the Write and Read methods for simple single thread synchronous blocking I/O.
1 2 3 4 5 6 7 8 9 10 11 12 13 | If tcpClient.Connected = True Then Dim networkStream As Net.Sockets.NetworkStream = tcpClient.GetStream() If networkStream.DataAvailable = True Then 'RECEIVE Dim size As Integer = 32 Dim mycompletemessage As System.Text.StringBuilder = New System.Text.StringBuilder() myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)) numberOfBytesRead = networkStream.Read(myReadBuffer, 0, size) RichTextBox2.Text = mycompletemessage.ToString & vbCrLf & RichTextBox2.Text End If End If End Sub |
haha, dat had ik niet in de gaten.quote:Op maandag 2 maart 2009 12:23 schreef TallMan het volgende:
Euh, misschien door te readen voordat je je data in je stringbuilder gaat flikkeren (regeltje 9 naar voor regeltje 8)
Lijkt me toch vrij elementair
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Connectie("10.0.10.99", 10000) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Disconnect() End Sub Function Connectie(ByVal ip As String, ByVal poort As Integer) Try tcpClient.Connect(ip, poort) Catch Exception1 As Net.Sockets.SocketException tcpClient.Close() MessageBox.Show("Error 1: " & Exception1.Message) Catch Exception2 As ObjectDisposedException tcpClient.Close() MessageBox.Show("Error 2: " & Exception2.Message) Catch Exception3 As NullReferenceException tcpClient.Close() MessageBox.Show("Error 3: " & Exception3.Message) End Try End Function Function Disconnect() Try tcpClient.Close() Catch Exception1 As Net.Sockets.SocketException MessageBox.Show("Error 4: " & Exception1.Message) Catch Exception2 As ObjectDisposedException MessageBox.Show("Error 5: " & Exception2.Message) Catch Exception3 As NullReferenceException MessageBox.Show("Error 6: " & Exception3.Message) End Try End Function |
1 |
Sorry, maar ik begrijp niet wat je probeert te vertellen.quote:Op woensdag 11 maart 2009 13:02 schreef TallMan het volgende:
je tcpclient, waar wordt die gezet, het probleem zal in de lifetime van dat object zitten dus alle News en Set Nothing van dat ding eens tracen.
Hij bedoelt jouw tcpclient object. Waar wordt die aangemaakt en wat gebeurt daar in de levensduur van jouw applicatie mee? Doe je op 'het eind' van jouw applicatie wel netjes alles afsluiten wat 'open' staat?quote:Op woensdag 11 maart 2009 13:18 schreef toma het volgende:
[..]
Sorry, maar ik begrijp niet wat je probeert te vertellen.
Misschien dat je een voorbeeld kunt geven.
Ik declareer mijn tcpclient aan het begin van het programma als je dat soms bedoeld.quote:Op woensdag 11 maart 2009 13:24 schreef Tuvai.net het volgende:
[..]
Hij bedoelt jouw tcpclient object. Waar wordt die aangemaakt en wat gebeurt daar in de levensduur van jouw applicatie mee? Doe je op 'het eind' van jouw applicatie wel netjes alles afsluiten wat 'open' staat?
1 |
Een tcpclient object open je altijd met [tcpclient-objectnaam].connect() en dien je weer te sluiten met [tcpclient-objectnaam].close(). Dat doe jij in je stukje code ook, echter zie ik dat jouw Close() commando plaatsvindt in Function Disconnect, die op z'n beurt weer uitgevoerd word door Button2_Click(). Wordt Button2_Click() wel áltijd uitgevoerd? Wordt de tcpclient wel geclosed als je de applicatie bijvoorbeeld gewoon 'afsluit' middels het kruisje van je venster?quote:Op woensdag 11 maart 2009 13:32 schreef toma het volgende:
[..]
Ik declareer mijn tcpclient aan het begin van het programma als je dat soms bedoeld.
[ code verwijderd ]
Daarna volgt de code die ik vanochtend heb gepost.
Moet ik deze tcpclient dan 'afsluiten' ? Ik snap het niet, maar dat komt ook omdat dit de eerste keer is dat ik met VB.NET werk.
Dat is niet zo zeer het probleem.quote:Op woensdag 11 maart 2009 14:24 schreef Tuvai.net het volgende:
[..]
Een tcpclient object open je altijd met [tcpclient-objectnaam].connect() en dien je weer te sluiten met [tcpclient-objectnaam].close(). Dat doe jij in je stukje code ook, echter zie ik dat jouw Close() commando plaatsvindt in Function Disconnect, die op z'n beurt weer uitgevoerd word door Button2_Click(). Wordt Button2_Click() wel áltijd uitgevoerd? Wordt de tcpclient wel geclosed als je de applicatie bijvoorbeeld gewoon 'afsluit' middels het kruisje van je venster?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | Public Client As New Net.Sockets.TcpClient Public Udpclient As New Net.Sockets.UdpClient Dim packet As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Connectie("10.0.10.99", 10000) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Disconnect() End Sub Function Connectie(ByVal ip As String, ByVal poort As Integer) Try If Client.Connected = 0 Then Client.Connect(ip, poort) TextBox1.Text = ("Connecting") Else TextBox1.Text = ("Already Connected!") End If Catch Exception1 As Net.Sockets.SocketException packet = "h" Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(packet) Udpclient.Send(data, data.Length, ip, 10001) Udpclient.Close() MessageBox.Show("Error 1: " & Exception1.Message) TextBox1.Text = ("Error") Catch Exception2 As ObjectDisposedException Dim Client As New Net.Sockets.TcpClient MessageBox.Show("Error 2: " & Exception2.Message) TextBox1.Text = ("Error") Catch Exception3 As NullReferenceException MessageBox.Show("Error 3: " & Exception3.Message) End Try End Function Function Disconnect() Try Client.Close() TextBox1.Text = ("Disconnecting") Catch Exception1 As Net.Sockets.SocketException MessageBox.Show("Error 4: " & Exception1.Message) TextBox1.Text = ("Error") Catch Exception2 As ObjectDisposedException MessageBox.Show("Error 5: " & Exception2.Message) TextBox1.Text = ("Error") Catch Exception3 As NullReferenceException MessageBox.Show("Error 6: " & Exception3.Message) TextBox1.Text = ("Error") End Try End Function End Class |
Dit verklaart nogal duidelijk waarom je een objectdisposedexception hebt kunnen vangen. Zeker erg onhandig omdat de connectie die er ligt naar je scanner open blijft waardoor een reconnect waarschijnlijk nogal moeilijk wordt (vaak willen dat soort apparaten maar 1 connectie accepteren)quote:Close : Disposes this TcpClient instance without closing the underlying connection.
1 |
1 |
1 |
1 |
1 |
1 |
1 2 3 4 5 6 | Client.Connect(ip, poort) TextBox1.Text = ("Connecting") Else TextBox1.Text = ("Already Connected!") End If |
1 2 | Client.Connect(ip, poort) |
Zodra je objecten disposed, dan gooi je ze 'weg' zoals de handeling al impliceert. Het hele object wordt weggegooid en ook het geheugen dat het betreffende object in beslag nam komt weer vrij. Dit is heel belangrijk in daadwerkelijke applicaties. In bijvoorbeeld webapplicaties hoef je daar veel minder rekening te houden omdat een webpagina op de server á la minute geparsed en na het weergeven/presenteren aan de gebruiker meteen vernietigd wordt. Connecties naar apparatuur of databases werken dan weer anders. Je legt een verbinding met iets, en je webpagina/applicatie laat deze verbinding dus voor een tijdje open staan (idle) als je de verbinding niet sluit. Veel apparaten en databases vinden het op z'n beurt weer niet zo leuk om te veel openstaande verbindingen te hebben en hebben daar ook vaak een limiet aan.quote:Op donderdag 12 maart 2009 12:07 schreef toma het volgende:
Bedankt dat was het
Maar waarom moet ik die Client opnieuw declareren? Omdat het object gedisposed is?
FYI: Dat is in het geval van Asp.net en Java absoluut niet zo. Je hebt daar gewoon een application scope. Het is altijd zaak om dit soort objecten netjes op te ruimen, er is geen garantie dat de GC ze kan verwijderen, daarom hebben ze een dispose methode.quote:Op donderdag 12 maart 2009 12:38 schreef Tuvai.net het volgende:
Zodra je objecten disposed, dan gooi je ze 'weg' zoals de handeling al impliceert. Het hele object wordt weggegooid en ook het geheugen dat het betreffende object in beslag nam komt weer vrij. Dit is heel belangrijk in daadwerkelijke applicaties. In bijvoorbeeld webapplicaties hoef je daar veel minder rekening te houden omdat een webpagina op de server á la minute geparsed en na het weergeven/presenteren aan de gebruiker meteen vernietigd wordt.
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |