UDP client   zodpovězená otázka

VB.NET

Dobrý den, prosím o radu. Na určitý UDP port mi chodí náhodně nějaký string a já bych si jej rád vypisoval. Problém je v tom, že mi to vypíše vždy jen jeden string co příjde a pak už žádný další. Jakoby aplikace přestala naslouchat. Jak to mám udělat, aby vždy po příchodu dat na port byla vyvolána nějaká akce? Kdysi jsem to řešil ve VB 6.0 pomoci winsock a tam bylo data arrival, jenže teď bych to rád řešil s využitím .NET.

Předem děkuji.

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
Imports System.Net.Sockets
Public Class Form1
    Dim Udp As UdpClient
    Dim REP As New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
    Dim ThreadReceive As System.Threading.Thread
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Udp = New System.Net.Sockets.UdpClient(1111)
        ThreadReceive = New System.Threading.Thread(AddressOf ReceiveMessages)
        ThreadReceive.Start()
    End Sub
 
    Public Sub ReceiveMessages()
        Dim receiveBytes As [Byte]() = Udp.Receive(REP)
        Dim BitDet As BitArray
        BitDet = New BitArray(receiveBytes)
        Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
        If Me.InvokeRequired() Then
            Dim dr As New DataRecievedDelegate(AddressOf UdpRecieved)
            Me.Invoke(dr, strReturnData)
        Else
            UdpRecieved(strReturnData)
        End If
    End Sub
 
    Delegate Sub DataRecievedDelegate(ByVal strReturnData As System.String)
    Sub UdpRecieved(ByVal strReturnData As System.String)
        ListBox1.Items.Add(strReturnData)
    End Sub
End Class
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den,

je to protože procedura ReceiveMessages se provede jen jednou. A to z důvodu, že ji poprvé a naposledy zavoláte v Button1_Click.Řešení:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Sub ReceiveMessages()
 Try
         Do While True
 
             Dim receiveBytes As [Byte]() = Udp.Receive(REP)
             Dim BitDet As BitArray
             BitDet = New BitArray(receiveBytes)
             Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
             If Me.InvokeRequired() Then
                 Dim dr As New DataRecievedDelegate(AddressOf UdpRecieved)
                 Me.Invoke(dr, strReturnData)
             Else
                 UdpRecieved(strReturnData)
             End If
         Loop
 Catch
     ' spojení zřejmě ukončeno
 End Try
 End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A kdybych to cele chtel udelat jako sluzbu systemu (samozdrejme bez formulare, jen by se to treba nekam logovalo) tak jak na to? Se servisem nemam problem, jen jak udelat, at se to nastartuje po startu servisu a stopne po zastaveni, co dat do kodu on start a on stop...

A kam pak dát toto:

1
2
3
4
5
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Udp = New System.Net.Sockets.UdpClient(1111)
        ThreadReceive = New System.Threading.Thread(AddressOf ReceiveMessages)
        ThreadReceive.Start()
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak uz to mam... jsem to co je v button1_click dal do on start a do on stop jsem dal udp.close a vypada to, ze to dela to co chci

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám ještě jeden dotaz k UDP, tentokrát k odesílání. Z jednoho počítače potřebuji něco odeslat na více počítačů v síti, přičemž znám vždy IP adresu a port cílového počítače. Nyní to dělám tak, že se mi spustí cyklus a vněm vždy provedu odeslání s tím, že se mi změní IP a port (což si načítám z pole).

1
2
3
4
5
For i = 1 To ClientCount
                    udpSend.Connect(GPSclientArray(i - 1).IP_adr, GPSclientArray(i - 1).port)
                    SendData = System.Text.Encoding.ASCII.GetBytes(strSendData)
                    udpSend.Send(SendData, SendData.Length)
                Next i

Nicméně pokud budu mít opravdu hodně počítačů, na které chci něco zaslat, tak se mi to zdá jako ne příliš šťastné řešení. Zajímalo by mne, jestli jde udělat to, že by se to odeslalo pouze jednou na nějaký "list" počítačů, prostě ať tam nemusí být ten cyklus. Děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nikdo???

nahlásit spamnahlásit spam 0 odpovědětodpovědět

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback