Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Winsock en tiempo real

Estas en el tema de Winsock en tiempo real en el foro de Visual Basic clásico en Foros del Web. hola soy Deiby el preguntando algo cosas de xml y winsock en el foro, me surge una duda espero me puedan ayudar... sucede lo siguiente ...
  #1 (permalink)  
Antiguo 06/05/2006, 19:11
 
Fecha de Ingreso: abril-2005
Mensajes: 44
Antigüedad: 19 años
Puntos: 0
Winsock en tiempo real

hola soy Deiby el preguntando algo cosas de xml y winsock en el foro, me surge una duda espero me puedan ayudar... sucede lo siguiente mando una instruccio SQL por winsock para que sea ejecutada en el servidor.. el servidor me regresara un archivo XML con el resultado del query, de regreso al cliente, le pido que me abra el archivo y me dice que no existe... esto sucede por que el VB no ejecuta la llamada a Winsock en tiempo real, espera a que termine todo el SUB o FUNCTION y luego manda la orden a winsock, entonces el servidor no creo el archivo a tiempo, no se si me explique.

1. Cliente se conecta

2. winsock.senddata "select * from tabla* (el servidor crea un query y lo manda al cliente)

3. datagrid= ARCHIVO_CREADO_POR_SERVER

4. Fin sub



el VB no ejecuta el paso 2 hasta que termina todo el sub, COMO LE PUEDO HACER PARA QUE LO EJECUTE Y ASI YA TENGA EL ARCHIVO EN EL CLIENTE.



PD . Actualmente lo estoy manejando por botones, 1. se conecta, otro hace el winsock, y otr tercer botoon lo pone en el datagrid, asi funcioan ala perfeccion PERO AL JUNTARLOS TODO EN UNO NO FUNCIONAN!!... bueno espero me heches la manita... gacias gracias gracias.. bye
  #2 (permalink)  
Antiguo 07/05/2006, 21:42
Avatar de marcos1979  
Fecha de Ingreso: abril-2004
Ubicación: 62º 06' 18" O / 33º 07' 47" S
Mensajes: 331
Antigüedad: 20 años
Puntos: 1
A ver si entiendo bien, la idea es enviarle la consulta al servidor, éste le devuelve el resultado en un xml el cual guardas en pa pc cliente y luego cargas el datagrid... estoy en lo correcto??

Si colocas todo en el mismo Sub ocurre que envia la consulta y luego intenta cargar el archivo, inmediatamente despues de enviar la consulta, pero todavia no se recibio el xml. La carga deberias hacerla en el evento DataArrival del Winsock del cliente. Puedes hacer que el server envie alguna cadena especial al terminar de enviar el archivo que le indique al cliente que ya puede cargar dicho archivo.

Corrígeme si estoy equivocado.
Un saludo
__________________
Marcos

El dinero no da la felicidad... démelo y sea feliz!!!
  #3 (permalink)  
Antiguo 08/05/2006, 11:08
 
Fecha de Ingreso: abril-2005
Mensajes: 44
Antigüedad: 19 años
Puntos: 0
datarrival

Cita:
Iniciado por marcos1979
A ver si entiendo bien, la idea es enviarle la consulta al servidor, éste le devuelve el resultado en un xml el cual guardas en pa pc cliente y luego cargas el datagrid... estoy en lo correcto??

Si colocas todo en el mismo Sub ocurre que envia la consulta y luego intenta cargar el archivo, inmediatamente despues de enviar la consulta, pero todavia no se recibio el xml. La carga deberias hacerla en el evento DataArrival del Winsock del cliente. Puedes hacer que el server envie alguna cadena especial al terminar de enviar el archivo que le indique al cliente que ya puede cargar dicho archivo.

Corrígeme si estoy equivocado.
Un saludo
El data arrival del client si esta programado para hacer lo propio con lo ke reciba por parte del servidor, el problema es que en la linea donde va winsock1.sendadata ...... la ejecuta como si fuera otra linea mas, y se va con la siguiente y asi hasta acabar todo el sub, al terminar el sub, es cuando manda los datos al servidor (osea que ejecuta el winsock1.senddata) kiero ke ejecute el sendadata cuando lo encuentre no al final del sub. se podra?
  #4 (permalink)  
Antiguo 08/05/2006, 13:12
Avatar de marcos1979  
Fecha de Ingreso: abril-2004
Ubicación: 62º 06' 18" O / 33º 07' 47" S
Mensajes: 331
Antigüedad: 20 años
Puntos: 1
Disculpa pero no entiendo, podrias poner el codigo aca asi vemos bien que es lo que necesitas???
__________________
Marcos

El dinero no da la felicidad... démelo y sea feliz!!!
  #5 (permalink)  
Antiguo 08/05/2006, 17:13
 
Fecha de Ingreso: abril-2005
Mensajes: 44
Antigüedad: 19 años
Puntos: 0
Cita:
Iniciado por marcos1979
Disculpa pero no entiendo, podrias poner el codigo aca asi vemos bien que es lo que necesitas???
'***************CLIENTE**********
Option Explicit
Public str_contenido_archivo As String, str_nombre_archivo As String, str_ruta_remota As String
Dim lng_tamaño_archivo As Long
Public oXML As XMLExport.clsXMLExport
Public NUMSOCKETS As Integer
Public myCommand As ADODB.Command
Public myConnection As ADODB.Connection
Public myRecordSet As ADODB.Recordset


Public Function CONECTAR(User As String, Password As String, SQL_instruction As String)
'esta fucnion recibe usuario, password e instrucciones que se quiere hacer para ponerlo en un Datagrid
Dim Archivo As String
Dim Comando As String
Dim STRXML As String
Dim oXML As New clsXMLExport
Archivo = "C:\XMLFile.xml"
Set myConnection = New ADODB.Connection
Set myCommand = New ADODB.Command
Set myRecordSet = New ADODB.Recordset
myConnection.ConnectionString = "Provider= SQLOLEDB.1;Persist Security Info= False;Password=" & Password & ";User ID=" & User & ";Initial Catalog=DBTURISMO;Data Source=MARCOS"
myConnection.Open
myCommand.ActiveConnection = myConnection
myRecordSet.Open SQL_instruction, myConnection, adOpenStatic, adLockOptimistic
On Error GoTo NOEXISTE
Kill (Archivo)
NOEXISTE:
myRecordSet.save Archivo, adPersistXML
'abrimos el archivo seleccionado pero en código binario
Open Archivo For Binary As #1
'almacenamos el contenido en una variable string
Me.str_contenido_archivo = Input(LOF(1), 1)
Close #1
lng_tamaño_archivo = Len(str_contenido_archivo)
End Function
Public Function CNX_OPEN(Servidor As String)
If Servidor = "" Then Servidor = "."
Set myConnection = New ADODB.Connection
Set myCommand = New ADODB.Command
Set myRecordSet = New ADODB.Recordset
myConnection.CursorLocation = adUseClient
myConnection.ConnectionTimeout = 30
myConnection.ConnectionString = "Driver={SQL Server};Server=" & Servidor & ";user=03420012;password=zamora;database=dbturismo "
myConnection.Open
myCommand.ActiveConnection = myConnection
End Function
Public Function COMMANDO(SQL As String)
myCommand.ActiveConnection = myConnection
myCommand.CommandType = adCmdText
myCommand.CommandTimeout = 30
myCommand.CommandText = SQL
Set myRecordSet = myCommand.Execute
End Function


Private Sub Command1_Click()
Call CONECTAR("mcssnt", "marcos", "select * from empresa")
End Sub

Private Sub Form_Load()
Me.Caption = Winsock1(0).LocalHostName & ": " & Winsock1(0).LocalIP
Winsock1(0).LocalPort = 666
Print "escuchando puerto " & Winsock1(0).LocalPort
Winsock1(0).Listen

End Sub

Private Sub Winsock1_Close(Index As Integer)
Print "Conexion cerrada: " & Winsock1(Index).RemoteHostIP
Winsock1(Index).Close
Unload Winsock1(Index)
NUMSOCKETS = NUMSOCKETS - 1
End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Print "Id de la solicitud de conexion: "; requestID & " de "; Winsock1(Index).RemoteHostIP
NUMSOCKETS = NUMSOCKETS + 1
Load Winsock1(NUMSOCKETS)
Winsock1(NUMSOCKETS).Accept requestID
Winsock1(0).Close
Winsock1(0).Listen

End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim vtData As String
Dim vtReturn As String
Winsock1(Index).GetData vtData, vbString
If Mid(vtData, 1, 6) = "Imagen" Then 'si es una direccion para una imagen lo hacemos
Dim Archivo As String
Dim X As Integer
For X = 7 To 64
If Not Mid(vtData, X, 1) = "|" Then
Archivo = Archivo & Mid(vtData, X, 1)
Else
Exit For
End If
Next X
'abrimos el archivo seleccionado pero en código binario
Open Archivo For Binary As #1
'almacenamos el contenido en una variable string
str_contenido_archivo = Input(LOF(1), 1)
Close #1
'la propiedad 'FileTitle' me devuelve el nombre del archivo selccionadoç
'el cual almaceno en la variable '.str_nombre_archivo'
'Me.str_nombre_archivo = Me<.cd_directorio.FileTitle
lng_tamaño_archivo = Len(str_contenido_archivo)
' Winsock1(Index).SendData lng_tamaño_archivo & "|" & str_contenido_archivo
End If
If INTERPRETA(vtData) = "Conectado" Then 'entonces se coneto e interpreta el codigo XML y lo pone en el recordset
'mandamos archivo
'Winsock1(Index).SendData "archivo|" & "c:\windows\temp\xmlfile.xml" & "|" & lng_tamaño_archivo & "|" & str_contenido_archivo
Winsock1(Index).SendData lng_tamaño_archivo & "|" & str_contenido_archivo
Else
'mensaje de error
Winsock1(Index).SendData "Error"
End If

End Sub


Public Function INTERPRETA(STRXML As String) As String
Dim User_ As String
Dim Pass_ As String
Dim SQL_instruction As String
Dim DOC As DOMDocument
Dim Cadena As IXMLDOMNodeList
Set DOC = New DOMDocument

' DOC.Load (strXML)
DOC.loadXML (STRXML)
'seleccionamos
Set Cadena = DOC.selectNodes("XML/USER")
User_ = Cadena.Item(0).Text
Set Cadena = DOC.selectNodes("XML/PASSWORD")
Pass_ = Cadena.Item(0).Text
Set Cadena = DOC.selectNodes("XML/PETICION")
SQL_instruction = Cadena.Item(0).Text

On Error GoTo NO
Call CONECTAR(User_, Pass_, SQL_instruction)
' Set xml = myRecordSet
INTERPRETA = "Conectado"
Exit Function
NO:
INTERPRETA = "Desconectado"
End Function
'******** SERVIDOR *********
El servidor si hace lo suyo, solo ke necesita la peticion del cliente, la cual tengo que ir manejando por clics primero
Private Sub cmdConect_Click()
Winsock1.RemoteHost = InputBox("Introduzca host remoto (IP) ", , Winsock1.LocalIP)
Winsock1.RemotePort = 666
Winsock1.Connect
End Sub
Luego va el segundo clic que manda el query al server
Private Sub Command11_Click()
Dim XML As String
Dim DOC As DOMDocument
Dim XMLL As IXMLDOMElement
Dim PETICION As IXMLDOMElement
Dim DATO As IXMLDOMElement
Dim STRXML As Variant

Set DOC = New DOMDocument
Set XMLL = DOC.createElement("XML")
DOC.appendChild XMLL

Set DATO = DOC.createElement("USER")
DATO.Text = "mcssnt"
XMLL.appendChild DATO

Set DATO = DOC.createElement("PASSWORD")
DATO.Text = "marcos"
XMLL.appendChild DATO

Set DATO = DOC.createElement("PETICION")
DATO.Text = "select ID_EMPRESA,NOMBRE,TELEFONO from EMPRESA WHERE ID_GIRO=1" 'ID_GIRO=1 IGSON LOS CINES
XMLL.appendChild DATO

STRXML = XMLL.Text
'Winsock1.SendData InputBox("datos a enviar", , DOC.XML)
Winsock1.SendData DOC.XML

End Sub
Ya que este generado el XML es enviado y el servidor lo recibe sin ningun problema ya solo ponemos el xml que no regresa el servidor en un datagrid
Private Sub Command12_Click()
Set dtgListaCines.DataSource = XML2RS("c:\windows\temp\myxml.xml")
Kill ("c:\windows\temp\myxml.xml")
End Sub

el codigo de esos 3 botones quiero ponerlo en un solo boton, pero no funciona por qu ela llamada de winsock la hace hasta encontrar el end sub.
¿quieres que ponga la parte del servidor?
  #6 (permalink)  
Antiguo 08/05/2006, 22:37
Avatar de marcos1979  
Fecha de Ingreso: abril-2004
Ubicación: 62º 06' 18" O / 33º 07' 47" S
Mensajes: 331
Antigüedad: 20 años
Puntos: 1
La verdad que es bastante codigo, pero para que se ejecute inmediatamente proba con DoEvents después de SendData (inmediatamente después):

WS.SendData dato
DoEvents
'Lo que siga

Igual, antes de cargar el archivo debes verificar si ya se recibió, puede que el servidor esté ocupado y no responda inmediatamente... se me ocurre

Espero que te sea de ayuda, cualquier cosa preguntá. Un saludo.
__________________
Marcos

El dinero no da la felicidad... démelo y sea feliz!!!
  #7 (permalink)  
Antiguo 08/05/2006, 23:28
 
Fecha de Ingreso: abril-2005
Mensajes: 44
Antigüedad: 19 años
Puntos: 0
DataArrival

Hey... buena solucion el DOEVENTS hace que se ejecute la conexion inmediatamente pero el ws.senddata no lo hace, asi que tambien utilize la opcion de ponerlo en el datarrival y funciono perfectamente. Gracias, por ahora creo que mi duda esta despejada yo creo que para ma;ana ya tendre otra duda :P je je GRACIAS GRACIAS
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:10.