![]() |
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 |
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 |
datarrival Cita:
|
Disculpa pero no entiendo, podrias poner el codigo aca asi vemos bien que es lo que necesitas??? |
Cita:
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? |
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 :borracho: Espero que te sea de ayuda, cualquier cosa preguntá. Un saludo. |
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 |
| La zona horaria es GMT -6. Ahora son las 06:24. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.