Namespace Library
<Serializable()> _
Public Class UserLogin
Private _name As String
Private _password As String
Public Sub New(ByVal UserName As String, ByVal Password As String)
_name = UserName
_password = Password
End Sub
Public ReadOnly Property UserName() As String
Get
Return _name
End Get
End Property
Public ReadOnly Property Password() As String
Get
Return _password
End Get
End Property
End Class
Public Delegate Sub DataReceivedDelegate(ByVal sender As Object, ByVal args As DataReceivedEventArgs)
Public Class DataReceivedEventArgs
Inherits EventArgs
Private _data As Object
Public Property Data() As Object
Get
Return _data
End Get
Set(ByVal value As Object)
_data = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal Data As Object)
_data = Data
End Sub
End Class
Public Class SimpleServer(Of T)
Private _ip As IPAddress
Public ReadOnly Property IP() As IPAddress
Get
Return _ip
End Get
End Property
Private _listener As TcpListener
Private _data As IEnumerable(Of T)
Public Property Data() As IEnumerable(Of T)
Get
Return _data
End Get
Set(ByVal value As IEnumerable(Of T))
_data = value
End Set
End Property
Private _port As Integer
Public ReadOnly Property Port() As Integer
Get
Return _port
End Get
End Property
Public Sub New(ByVal port As Integer, ByVal ip As IPAddress)
_ip = ip
_port = port
_listener = New TcpListener(ip, port)
End Sub
Public Sub SendData()
Try
While True
Using client As TcpClient = _listener.AcceptTcpClient()
Using netStream As NetworkStream = client.GetStream()
While True
Using memStream As MemoryStream = New MemoryStream()
For Each item As T In Data
Dim formatter As New BinaryFormatter()
formatter.Serialize(memStream, item)
Dim data() As Byte = memStream.GetBuffer()
Dim length() As Byte = BitConverter.GetBytes(data.Length)
netStream.Write(length, 0, length.Length)
netStream.Write(data, 0, data.Length)
memStream.Position = 0
Next
Exit While
End Using
End While
End Using
Exit While
End Using
End While
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
_listener.Stop()
End Try
End Sub
Public Sub Listen()
_listener.Start()
SendData()
End Sub
End Class
Public Class SimpleClient(Of T)
Private _port As Integer
Public ReadOnly Property Part() As Integer
Get
Return _port
End Get
End Property
Private _ip As IPAddress
Public ReadOnly Property IP() As IPAddress
Get
Return _ip
End Get
End Property
Private _serverPort As Integer
Public ReadOnly Property ServerPort() As Integer
Get
Return _serverPort
End Get
End Property
Private _serverIP As IPAddress
Public ReadOnly Property ServerIP() As IPAddress
Get
Return _serverIP
End Get
End Property
Private _dataReceivedEvent As DataReceivedDelegate
Public Sub PassDelegate(ByVal del As DataReceivedDelegate)
_dataReceivedEvent = del
End Sub
Public Sub New(ByVal port As Integer, ByVal ip As IPAddress, ByVal serverPort As Integer, ByVal severIP As IPAddress)
_port = port
_ip = ip
_serverPort = serverPort
_serverIP = severIP
End Sub
Private Sub OnDataReceivedEvent(ByVal args As DataReceivedEventArgs)
If Not _dataReceivedEvent.Equals(Nothing) Then
_dataReceivedEvent(Me, args)
End If
End Sub
Private Function ReceiveFixedData(ByVal netStream As NetworkStream, ByVal count As Integer) As Byte()
If (netStream.Equals(Nothing)) Then
Throw New ArgumentNullException("stream")
End If
If count <= 0 Then
Throw New ArgumentOutOfRangeException("count", "Parameter's value cannot be 0 or less than 0.")
End If
Dim buffer(count) As Byte
Dim receivedCount As Integer
Dim position As Integer = 0
' read until all data is received.
Do While (position < count)
receivedCount = netStream.Read(buffer, position, count - position)
If receivedCount = 0 Then
Return Nothing
End If
position += receivedCount
Loop
Return buffer
End Function
Public Sub ConnectServer()
Using client As New TcpClient(New IPEndPoint(_ip, _port))
client.Connect(_serverIP, _serverPort)
Using netStream As NetworkStream = client.GetStream()
While True
' get the number of bytes to be read in order to retrieve all message
Dim data() As Byte = ReceiveFixedData(netStream, 4)
If data Is Nothing Then
Exit Sub
End If
Dim messageLength As Integer = BitConverter.ToInt32(data, 0)
If messageLength > 0 Then
data = ReceiveFixedData(netStream, messageLength)
If data.Equals(Nothing) Then
Return
End If
Dim formatter As New BinaryFormatter()
Using memStream As MemoryStream = New MemoryStream(data)
Dim message As T = CType(formatter.Deserialize(memStream), T)
OnDataReceivedEvent(New DataReceivedEventArgs(message))
End Using
End If
End While
End Using
End Using
End Sub
End Class
End Namespace