Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Net
Imports System.Net.Sockets
Namespace ConsoleApplication1
Class Program
Private Shared Sub Main(ByVal args As String())
'Declaro la cadena sin la longitud
Dim mensaje As String = "1:1;2:0001;3:CAJA1SUC1;4:1C-6F-65-5C-5B-30;5:APHSUC1;6:VT;7:0001;8:20111123;9:143610;10:4431573622;11:1000"
'Indica que el mensaje no va encriptado
Dim encriptar As [Byte]() = Encoding.ASCII.GetBytes("N")
'delcaro mi entero que almacena la longitud de mi cadena.
Dim longitud As Integer = mensaje.Length
Dim SendBytes As [Byte]() = Encoding.ASCII.GetBytes(mensaje)
'agrego un arreglo de bytes para enviarlo al socket
'No hay que convertir el entero a string (ej. el 0 ascii es el entero 48)
'tambien hay que usar IPAddress.HostToNetworkOrder
'ya que microsoft utiliza un orden de bytes little-endian y java utiliza el big-endian
'(ej. el 987 en un endian puede ser 620560384 en otro endian)
Dim SendBytesLongitud As [Byte]() = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longitud))
'Para leer la longitud de respuesta
Dim RecvBytesLen As Byte() = New Byte(3) {}
Dim ipaddr As IPAddress = System.Net.IPAddress.Parse("192.168.1.68")
Dim Ep As New IPEndPoint(ipaddr, 9099)
Dim socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Try
socket.Connect(Ep)
'envío primero la longitude la cadena
socket.Send(SendBytesLongitud, 0, SendBytesLongitud.Length, SocketFlags.None)
'enviar si hay que encriptar
socket.Send(encriptar, 0, encriptar.Length, SocketFlags.None)
'una vez enviada la longitud, envío la cadena
socket.Send(SendBytes, 0, SendBytes.Length, SocketFlags.None)
'Recibe la longitud de la respuesta
socket.Receive(RecvBytesLen, RecvBytesLen.Length, SocketFlags.None)
'hace la coversion de los bytes de big-endian a little-endian
Dim lenlittle As Byte() = ReverseBytes(RecvBytesLen)
'Recerva el espacio para recibir el mensaje de respuesta
Dim RecvBytes As [Byte]() = New [Byte](BitConverter.ToInt32(lenlittle, 0) - 1) {}
'Recibe el mensaje
socket.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None)
Dim respuesta As [String] = Encoding.ASCII.GetString(RecvBytes, 0, RecvBytes.Length)
Console.WriteLine(respuesta)
Console.ReadLine()
Catch [error] As Exception
Console.WriteLine("Ha ocurrido un error: " & Convert.ToString([error]))
Console.ReadLine()
End Try
End Sub
Private Shared Function ReverseBytes(ByVal inArray As Byte()) As Byte()
Dim temp As Byte
Dim highCtr As Integer = inArray.Length - 1
For ctr As Integer = 0 To inArray.Length \ 2 - 1
temp = inArray(ctr)
inArray(ctr) = inArray(highCtr)
inArray(highCtr) = temp
highCtr -= 1
Next
Return inArray
End Function
End Class
End Namespace