Salve,
Io vorrei far comunicare due applicazioni tramite il protocollo TCP. I client capiscono che devono comunicare con altri client tramite il polling a una tabella di un database online quindi non utilizza un server remoto
Il codice che ho trovato per la comunicazione TCP è il seguente:
codice:
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Net.Sockets
Imports System.Net.Sockets.TcpClient
Imports System.Net
Imports System
Public Class Form1
Private moTcpClient, moTcpRxClient As TcpClient
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim moTcpServer = New TcpListener(13000)
moTcpServer.Start() 'inizia la connessio tramite il TCP
lb1.Text = ("Listening...")
Button3.Enabled = False
Button2.Enabled = True
Button1.Enabled = False
Do While Not moTcpServer.Pending
Application.DoEvents()
Loop
moTcpRxClient = moTcpServer.AcceptTcpClient
lb1.Text = "Connection received..."
moTcpServer.Stop()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If TextBox1.Text <> "" And TextBox2.Text <> "" And IsNumeric(TextBox2.Text) Then
Dim moLocalIP = Dns.GetHostByName(Dns.GetHostName)
Dim ip = moLocalIP.AddressList(0).ToString
'// Creates object
Dim oPerson As New Person(TextBox1.Text, Int32.Parse(TextBox2.Text))
'// Let's use dotNET TcpClient
moTcpClient = New TcpClient()
moTcpClient.Connect(ip, 13000) 'ip del destinatario, porta di uscita
'moTcpClient.Connect("192.168.2.3", 13000)
If moTcpClient.GetStream.CanWrite Then 'controlla se può scrivere
'// Serializes object in memory
Dim bf As New BinaryFormatter()
Dim oStream As New System.IO.MemoryStream()
bf.Serialize(oStream, oPerson)
'// Gets bytes...
Dim buf(CInt(oStream.Length)) As Byte
oStream.Position = 0
Dim iRet As Int32 = oStream.Read(buf, 0, buf.Length)
oStream.Close()
'// Send object through TCP-IP...
moTcpClient.GetStream.Write(buf, 0, buf.Length)
Button3.Enabled = True
Button2.Enabled = False
End If
Else
MsgBox("errore")
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'// Deserializes object
Dim oNs As NetworkStream = moTcpRxClient.GetStream
If oNs.CanRead Then 'controlla se può leggere
If oNs.DataAvailable Then 'controlla se sono presenti dei dati da leggere
'// Deserializes object
Try
Dim bf As New BinaryFormatter()
Dim oRxPerson As Person = CType(bf.Deserialize(oNs), Person)
risultato.Text += String.Format("Name:{0} Age:{1}", oRxPerson.Name, oRxPerson.Age)
Catch ex As Exception
'// Something wrong...
MessageBox.Show(ex.Message, "Deserialization error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
'// Closes connection
moTcpRxClient.Close()
' btnDeser.Enabled = False
Button3.Enabled = False
Button2.Enabled = False
Button1.Enabled = True
End Try
End If
End If
End Sub
End Class
'// Just a simple person object...
<Serializable()> Public Class Person
Public Name As String
Public Age As Int32
Public Sub New(ByVal name As String, ByVal age As Int32)
Me.Name = name
Me.Age = age
End Sub
End Class
questo esempio si basa su un pulsante che mette in ascolto tramite un loop l'applicazione, un pulsante che server per inviare il testo e un pulsante che serve a riceverlo.
come posso mettere l'ascolto continuo, ad esempio attraverso un timer e anche la ricezione non legata ad un pulsante.