como usar winsock, si es posible, para realizar un minichat

Iniciado por fraktal, 18 Septiembre 2006, 02:54 AM

0 Miembros y 2 Visitantes están viendo este tema.

fraktal

Hola, mi objetivo es hacer una pequeña aplicacion que funcione entre 2 ordenadores por internet y se puedan enviar y recibir archivos. He empleado para ello winsock, pero no me funciona y no se pq. No se si es pq quiza la idea de cliente/servidor para esto es errornea, pues quiza esto que digo seria mas como cliente/cliente, pues se trataria de hacer un ejecutable, el mismo para ambos ordenadores, y realmente me pierdo porque creo que ninguno deberia trabajar como cliente ni servidor... si no a lo mucho ambos como cliente. Pero no me funciona  y no se si es pq no se puede hacer mediante winsock o es que lo ago mal. Entonces aber si me podeis ayudar o guiarme o decirme si es que necesito hacerlo con otro control distinto a winsock, que parece mas encaminado a eso, cliente servidor, osea el cliente hace una peticion y el servidor la devuelve si puede...

Private Sub cmdconectar_Click()
On Error Resume Next
ws.RemoteHost = "10.0.0.3" 'meter al ip buena
ws.RemotePort = 2001
ws.Close
ws.Connect
If Not ws.State = 7 Then
ws.Close
ws.LocalPort = "2001"
ws.Close
ws.Listen
Label1.Caption = "ESCUCHANDO"
End If


End Sub

Private Sub cmdenviar_Click()
ws.SendData txttexto.Text
End Sub

Private Sub Form_Load()
nombre = InputBox("Introduce tu nombre de sesion:", "Bienvenido...")
If nombre = 1 Then
RemoteHost = "10.0.0.3"
ElseIf nombre = 2 Then
RemoteHost = "10.0.0.3"
End If
Form1.Caption = nombre & RemoteHost
End Sub

Private Sub Timer1_Timer()
If Not ws.State = 7 Then
ws.Close
ws.Connect
End If

End Sub

Private Sub ws_ConnectionRequest(ByVal requestID As Long)
ws.Close
ws.Accept (requestID)
Label1.Caption = "CONECTADO"

End Sub

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
ws.GetData datos
rpt = MsgBox(datos, vbOKOnly)
End Sub




Explico lo que he exo, no se si lo abre dejado con algo raro pq ya de tantas pruebas no se.
Primero cuando carga el formulario pregunta un nombre. Por defecto he puesto 1 y 2 como respuestas para asignar una Ip a la que se conectara. Mas que nada de momento he exo eso para ver si podia yo hacer las pruebas en mi propio ordenador y asignando la misma IP. He puesto la misma IP pq haciendo pruebas anteriroes con Winsock vi que podia hacer un cliente y un servidor y desde mi propio ordenador conectarme del cliente al servidor, entonces deduje que aqui tb podria usar la misma IP. Bien a continuacion abria en el formulario un boton cmdconectar que lo que hace es lo siguiente: Primero trata de conectarse a la ip y al puerto que le digo. Entonces comprueba el estado de la conexion y si es no conectado, lo que hace es que se queda a la espera, osea a la escucha, para ello abre el puerto y se mantiene a la espera. De tal manera, que si abro otra vez la misma instancia del exe, y le doy a conectar, al estar el otro a la escucha en el puerto, pues esta vez la primera parte del codigo funcionaria y se conectaria. Luego esta el procedimiento de que acepta la conexion, y como digo parece que todo va bien, pero es que el problema que veo es que es como si todo fuera en un sentido , y no en los dos, pq solo el procedimiento de DataArrival se produce en uno de los prograamas. Bien luego tengo un texbox donde se pondria el texto a enviar y un boton de enviar. Ademas deun label que dice el estado de la conexion. Entonces escribo en el textbox y de momento antes de ponerme a meterlo en un picturebox, lo que he exo es que ese dato enviado aparezca en pantalla mediante un msgbox... pero como digo no me funciona. Podeis ver el fallo o que pasa?. Muchas gracias. Saludos.

MANULOMM

bueno la primera duda es que para no tener que utilizar la ocx llames al winsock desde la api (La cual No me la se pues soy semi principiante) lo otro es que el concepto debe ser cliente/servidor pues el servidor abre un puerto colocando a la escucha, entonces por obligacion uno debe ser cliente y otro servidor, estos conceptos no varian la estructura del programa pues el servidor lo unico que hace es abrir un puerto y que el cliente se conecte a el, es algo como el macho y la hembra de un cable....
Espero que esto te sirva....



JUAN MANUEL LOMBANA
MEDELLÌN - COLOMBIA


fraktal

Ok gracias, sabiendo eso me ayuda pues se que voy por el camino adecuado. Haber entonces si alguien lee el codigo y ve donde cometo el error pues me falla. Eso es lo que yo intentaba acer, primero que intentase conectarse, y si ve que no existe el puerto a la escucha del otro programa esperandole, que se ponga a la espera. Y al ejecutar la otra instancia como lo primero que hace es intentar conectarse a un puerto que escuche, como ya el otro esta escuchando, pues se conecta. Y realmente hasta eso llego bien, pero luego ya cuando invento enviar datos no puedo. Me da un error de programacion. Gracias. S2.

~~

Hola:

Lo primero una aclaracion a cerca del funcionamiento de los chats un poco decentillos:

Creo q funcionan asi: Existe un solo servidor y los usuarios tiene ckientes q se conectan a él (tipo messenger) El servidor se encarga de administrar las combersaciones.

Si tu solamente kieres hacer un caht entre dos personas no te hace falta todo esto, con dos aplicaciones como las q estas haciendo ahora te sobra.  ;)

En cuanto a lo del fallo puede q este aki:

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
ws.GetData datos
rpt = MsgBox(datos, vbOKOnly)
End Sub


Sustitulle la ultima linea por
msgbox datos,vbokonly,"CHAT"
A ver si asi te llegan.

Para q los dos programas puedan interactuar tiene q poner el evento ws_DataArrival en ambos.

Mira te improviso ahora en un momen un chat para dos pc's:

'La parte de q se conecten y tal la pones como la tuya por ejemplo
'q es siempre lo mismo
'lst es un listbox, ws el winsock, txtMensaje el textbox donde
'escribimos lo q vamos a mandar y cmdMandar el boton donde
'le damos para enviar


Dim nick As String

Private Sub cmdMandar_Click()
lst.AddItem (nick & " dice:")
lst.AddItem (txtMensaje.Text)
ws.SendData "nk" & nick & " dice:"
ws.SendData "co" & txtMensaje.Text
txtMensaje.Text = ""
End Sub

Private Sub Form_Load()
nick = InputBox("Introduce nick", nick)
End Sub

Private Sub ws_DataArrival(ByVal bytesTotal As Long)

Dim datos As String
ws.GetData datos

If Left(datos, 2) = "nk" Then
    lst.AddItem (Mid(datos, 3))
End If

If Left(datos, 2) = "co" Then
    lst.AddItem (Mid(datos, 3))
End If

End Sub


Esto lo tienes q incluir en los dos, despues solo te keda poner tb a los dos a la escuxa de un puerto en el formload (por si alguien te kiere hablar) y añadir un boton en el q te puedas conectar a una ip q tienes q escribir en un text box o algo asi  ;D  (por supuesto esto tb en los dos), digo dos pero con este metodo puedes hablar con todas las personas q kieras, siempre q conozcas su ip, eso si, si kieres q se pueda hablar con varias a la vez tienes q hacer una matriz de controles ws... Si kieres q haga esto dale a buscar, WarGhost tenia por ahi un code muy weno pa esto, y si no pos posteas aki y te intentamos ayudar

Espero q te sea util y q funcione, por q lo acabo de escribir, ni sikiera lo e provado xDDDDD pero vamos q tiene pinta de haberme kedado muy chulo, no te parece????

1S4ludo

fraktal


GroK

"I put on my Hendrix album and my son said 'Dad, who's that?' and i said 'Well son, that's God' "- Robert Plant


fraktal

Hola, gracias a todos. Ya he averiguado cual era el problema. El problema es que yo intentaba primero intentar conectar con una posible misma instancia del programa a la escucha. SI eso no se producia, que se pusiera el mismo a escuchar. Y bien, la teoria es buena, pero si yo ejecutaba una instancia, hacia eso, inentaba conectarse, como no abia ninugno a la escucha, el mismo se ponia a la escucha. Hasta ahi todo bien. Luego ejecutaba otra instancia, y en ese momento, ok, conectaba con la otra instancai que estaba a la escucha y aqui viene mi problema pq la siguiente sentencia era
if not ws.state = 7
osea le estaba diciendo, que si no estaba conectado, se volviera a poner a la escucha, osea si su estado no era 7. Y resulta, que una vez realizada la conexion, tarda un ratin en cambiar de estado, con lo cual, realmente el estado sigue sin ser 7, con lo cual la segunda instancia entraba en el if y volvia a poner esta instancia a la escucha. De modo, que tuve que arreglarlo con el estado actuar en el cua se encontraba, y tb metiendolo en un timer para darle tiempo a realizar la conexion.
Muchas gracias y saludos.