Editores de server y server builder
En esta mini guía voy a explicar o mas bien a dar ideas para crear editores de Server y generadores de Server para sus proyectos Cliente-Servidor.
Estos editores ayudan haciendo ver un poco mas profesional el trabajo realizado, aquí se va a usar la versión visual basic.Net 2005 Profesional , pero la Express servirá perfectamente
Todas estas ideas las saque de métodos que se usaban en VB6 ya notaran que son parecidas ,las ideas originales las saque de la versión 6 no son mías pero de la .Net si .
Empezamos creando un proyecto grafico con 2 textbox y un commandButton.
Eso es para el editor
Algo así mas o menos debemos de dejar.
Luego ustedes podrán añadir mas opciones de mientras dejaremos esas para el ejemplo.
Creamos otro proyecto al que llamaremos Server ,igual que el anterior colocamos 2 textbox pero esta vez sin el comandButton.
Para poderlo editar perfectamente sin que se dañe el server , tenemos que abrirlo de forma binaria y colocar los datos hasta el Final del archivo.
Después cuando en el server debemos de leernos en forma binaria para obtener los datos.
Comencemos con el Edtor:
Primero importamos el nameSpace IO para poder trabajar con flujos de entrada y salida y de forma binaria.
Después en el form dentro del evento on click del commandButton colocamos este code:
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim fs As FileStream
Dim bw As BinaryWriter
Dim directorio As String = "server.exe"
fs = New FileStream(directorio, FileMode.Append, FileAccess.Write)
bw = New BinaryWriter(fs)
Dim puerto As String = TextBox1.Text
Dim pass As String = TextBox2.Text
Dim i As Integer
For i = puerto.Length + 1 To 5
puerto = " " + puerto
Next
Dim a As Integer
For a = pass.Length + 1 To 5
pass = " " + pass
Next
bw.Write(puerto & "\" & pass)
bw.Close() : fs.Close()
Catch ex As IOException
Console.WriteLine("Error:" + ex.Message)
End Try
End Sub
End Class
Primero declaramos Fs como flujo de entrada y salida.
Bw lo declaramos para poder escribir en forma binaria la declaración binaryWriter nos permite eso.
Directorio es el lugar donde se encuentra el server.
Aquí:
fs = New FileStream(directorio, FileMode.Append, FileAccess.Write)
Creamos un objeto con la variable fs ,el objeto es del tipo filestream por lo tanto nos permite la entrada y salida de datos ,en la primera posición va la aplicación a editar en ese caso server.exe ya declarado, después filemode nos permite elegir de que modo se va a abrir en este caso es append es decir al final del archivo para no dañar el contenido y por ultimo el modo de acceso que es para escribir.
Dim puerto As String = TextBox1.Text
Dim pass As String = TextBox2.Text
Declaramos el valor de puerto y pass corresponden a las cajas de texto.
Dim i As Integer
For i = puerto.Length + 1 To 5
puerto = " " + puerto
Next
Esta parte es muy importante y de aquí depende su funcionamiento:
Tenemos que tener contados y separados los caracteres para que cuando programemos el servidor no coma datos que no pertenecen por eso debemos de dejar un espacio predefinido.
Aquí estamos dejando un espacio para 5 caracteres, si no pusiéramos este código tendríamos que colocar exactamente 5 caracteres para que no diera error , así que esta parte nos permite poner cualquier cantidad entre 0 y 5 en cada caja de texto , si escribimos demás también nos dará un error para ello debemos de aumentar la cantidad.
Asi que contamos la longitud de la variable puerto y la llevamos hasta 5 aumentado un espacio atras de la variable para que no de error , posteriormente quitaremos esos espacios en el server.
Dim a As Integer
For a = pass.Length + 1 To 5
pass = " " + pass
Next
Hacemos lo mismo que en el anterior codigo.
bw.Write(puerto & "\" & pass)
bw.Close() : fs.Close()
Procedemos a escribir los datos separados por una diagonal para posteriormente podelos separar.
y cerramos los flujos.
Catch ex As IOException
Console.WriteLine("Error:" + ex.Message)
End Try
Si hay un error atrapamos la exepción y mostramos el mensaje de error evitando un cierre de programa.
SERVER
En el server ira el siguiente codigo:
Imports System.IO
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim br As BinaryReader '//Declaramos variable para abrir como binario//
Dim nombre As String = "server.exe" '//fila a abrir
Dim fs As FileStream '/Variable para flujo de entrada
fs = New FileStream(nombre, FileMode.Open, FileAccess.Read) '/Condiciones flujo de entrada
br = New BinaryReader(fs) '//Declaramos en binary reader condiciones de fs
Dim puerto As String 'Variable en donde se almacena la info
br.BaseStream.Seek(-12, SeekOrigin.End) 'nos pocicionamos al final menos 12
puerto = br.ReadString '//Leemos 12 caracteres que equivale a 5 en un lado y 5 en otro
'Se desperdicia -1 asi que para 10 seria -11 pero mas el "\".
Dim lugar As Integer '//Lugar donde se encuentra el punto clave a separar.
lugar = InStr(puerto, "\") 'Buscamos el punto clave y almacenamos su poscicion en lugar.
Dim str2 As String 'Declaramos una variable para partir la original.
str2 = puerto.Substring(lugar) 'La partimos desde el punto clave
Dim str As String
str = puerto.Remove(lugar - 1) 'Almacenamos en str lo removido despues del punto clave -1_
'ese menos 1 es del "\"(la diagonal)
TextBox1.Text = str.Trim 'Quitamos espacios
TextBox2.Text = str2.Trim
fs.Close() : br.Close() 'Cerramos los flujos.
End Sub
End Class
Aqui ya tiene comentarios asi que solamente detallo las partes imporantes:
br.BaseStream.Seek(-12, SeekOrigin.End)
puerto = br.ReadString
Dim lugar As Integer
lugar = InStr(puerto, "\")
aqui usamos el objeto br y la propiedad baseStream para poder acceder a seek , en accesos aleatorios podemos usar Seek directamente pero como estamos en binario nos basamos de baseStream para abrirlo.
Seek nos permite posicionarnos en cualquier parte de un fichero SeekOrigin.End nos permite colocarnos al final del archivo es -12 porque:
5+5 de los datos de las cajas de texto van 10 , + 1 de la diagonal (“\”) y menos 1 que siempre se debe de restar ese uno y van 12, si quisiéramos que el usuario pudiera introducir 6 caracteres en cada caja tendríamos que poner -14 en lugar de -12 y así sucesivamente dependiendo de las necesidades del programa.
Recuerden que si van a aumentar aquí tendrían que hacerlo también en el servidor para registrar mas espacios en caso que no se completaran los caracteres.
y fin del editor de server ahora ya podemos hacer las pruebas.
Constructor del server
Este nos permite generar el servidor a partir del ejecutable .
El codigo del editor esta vez sería así:
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
serverbuild()
Try
Dim fs As FileStream
Dim bw As BinaryWriter
Dim directorio As String = "server.exe"
fs = New FileStream(directorio, FileMode.Append, FileAccess.Write)
bw = New BinaryWriter(fs)
Dim puerto As String = TextBox1.Text
Dim pass As String = TextBox2.Text
Dim i As Integer
For i = puerto.Length + 1 To 5
puerto = " " + puerto
Next
Dim a As Integer
For a = pass.Length + 1 To 5
pass = " " + pass
Next
bw.Write(puerto & "\" & pass)
bw.Close() : fs.Close()
Catch ex As IOException
MsgBox("Error:" + ex.Message)
End Try
End Sub
Sub serverbuild()
Dim cliente As String
Dim server As String
FileOpen(1, My.Application.Info.DirectoryPath & "\" & My.Application.Info.AssemblyName & ".exe", OpenMode.Binary, OpenAccess.Read)
cliente = Space(LOF(1) - 28672)
server = Space(28672)
FileGet(1, cliente)
FileGet(1, server)
FileClose(1)
FileOpen(2, My.Application.Info.DirectoryPath & "\" & "server.exe", OpenMode.Binary)
FilePut(2, server)
FileClose(2)
End Sub
Lo que cambia es que en la propiedad del click llamamos a serverBuild antes y creamos un nuevo subprocedimiento que es el que llamamos :
FileOpen(1, My.Application.Info.DirectoryPath & "\" & My.Application.Info.AssemblyName & ".exe", OpenMode.Binary, OpenAccess.Read)
Nos abrimos a nostros mismos , el 1 es un identificador como #1 que declarabas en visual basic y nos abrimos en modo binario para leer.
cliente = Space(LOF(1) - 28672)
server = Space(28672)
Almacenamos en cliente el espacio que resta despues de 28672 bits que es el peso del server, para saberlo , antes compilamos el server , vamos a propiedades y vemos el peso ese peso lo remplazamos por 28672 , LOF(1) nos permite llegar al final de un archivo.
Despues hacemos lo mismo con server pero esta vez el espacio restante que es lo que pesa el.
FileOpen(2, My.Application.Info.DirectoryPath & "\" & "server.exe", OpenMode.Binary)
FilePut(2, server)
Creamos el directorio server.exe en modo binario y colocamos los datos que obtuvimos en server.
En el server es el mismo codigo y la misma explicación.
Ahora para poder generar un solo ejecutable tenemos que descargar un editor hexadecimal(Por cierto quiero dar un parentesis para agradecer a WarGhost que el me dio la idea del generador del server en Visual Basic 6 yo la pase al .Net para ayudar a los que han cambiado a este lenguaje).
El editor hexadecimal es para pegar los datos del server y el cliente , para dejar uno solo.
Primero debemos de dejar los datos del Cliente y luego los del server , así que abrimos con el editor el Server y copiamos todos sus datos .
Luego abrimos el editor y nos vamos hasta al final hasta el ultimo cero que haya y lo pegamos .
Por ultimo guardamos lo editado con extensión .exe y listo ya
lo tenemos.
Creo que no van a quedar tantas dudas pues lo explique muy especificamente , pero cualquier cosa dila .
Seguro que con esto van a surgir nuevas ideas , que van a acortar muchisimo mas el codigo y lo van a hacer un poco mas facíl eso ya esta en su imaginación.
Por si se llegaran a presetar dificultades dejo los proyectos , junto con el ServerBuilder ya Compilado
http://mx.geocities.com/esteban_7_21/ProyectoNet.zipSalu2