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:
Código [Seleccionar]
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í:
Código [Seleccionar]
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.
CitarDim puerto As String = TextBox1.TextDeclaramos el valor de puerto y pass corresponden a las cajas de texto.
Dim pass As String = TextBox2.Text
CitarDim i As IntegerEsta parte es muy importante y de aquí depende su funcionamiento:
For i = puerto.Length + 1 To 5
puerto = " " + puerto
Next
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.
Código [Seleccionar]
Dim a As Integer
For a = pass.Length + 1 To 5
pass = " " + pass
Next
Hacemos lo mismo que en el anterior codigo.
Código [Seleccionar]
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.
Código [Seleccionar]
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:
CitarImports 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:
Citarbr.BaseStream.Seek(-12, SeekOrigin.End)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.
puerto = br.ReadString
Dim lugar As Integer
lugar = InStr(puerto, "\")
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í:
Código [Seleccionar]
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 :
CitarFileOpen(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.
Citarcliente = Space(LOF(1) - 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.
server = Space(28672)
Despues hacemos lo mismo con server pero esta vez el espacio restante que es lo que pesa el.
Código [Seleccionar]
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.zip
Salu2