SoloCodigo
Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: Anna en Sábado 5 de Abril de 2003, 19:32
-
Necesito ayuda urgente. ¿Alguien me puede explicar porque no funciona este cliente-servidor. Cada
vez que envio un mensaje de cliente a servidor me da error. Dice algo asi como "No es posible
enviarlo en el estado que está". Y si lo envia no aparece en el txtoutput del servidor
Y segunda pregunta: Para permitir más de una conexión, es decir, que se conecte más de un
cliente, ¿lo estoy haciendo bien, o necesito poner algo más?
Aqui está todo el código
CLIENTE
Private Sub cmdsalir_Click()
Unload Me
End Sub
Private Sub cmdConnect_Click()
If cliente.State <> sckClosed Then cliente.Close
'cliente.Close
cliente.RemoteHost = cliente.LocalIP
cliente.Connect , 40000
MsgBox "El cliente" + cliente.LocalIP + "Ha conectado con" + cliente.RemoteHost
cmdConnect.Enabled = False
End Sub
Private Sub cmdenviar_Click()
If TxtSend.Text <> "" Then
cliente.SendData TxtSend.Text
TxtSend.Text = ""
TxtSend.SetFocus
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
datos = TxtSend.Text
cliente.SendData enviar
Private Sub Form_Load()
'Text1.Text = Data1.Recordset("NICK")
Text2.Text = cliente.LocalIP
Text3.Text = Time
End Sub
///////////////////////////////////////////////////////////////////
SERVIDOR
Dim Estado As String * 1
Dim i As Long
Private Sub cmdescuchar_Click()
Estado = "I"
Form_Activate
MsgBox "El servidor " + servidor(0).LocalHostName + " a la escucha"
End Sub
Private Sub Form_Activate()
i = 0
Select Case Estado
Case "I":
If servidor(0).State <> sckClosed Then servidor(0).Close
servidor(0).Bind 40000
' servidor(0).LocalPort = 40000
servidor(0).Listen
Estado = "L"
'frmclient.Show
'frmlogin.Show
End Select
End Sub
Private Sub Form_Load()
Estado = "I"
Text1.Text = servidor(0).LocalIP
End Sub
Private Sub cmdenviar_Click()
Dim enviar As String
enviar = TxtOutput.Text
servidor(i).SendData TxtOutput.Text
End Sub
Private Sub servidor_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If servidor(i).State <> sckClosed Then servidor(i).Close
For i = 0 To 4
Load servidor(i)
servidor(i).LocalPort = 0
servidor(i).Accept requestID
' Load TxtSendData(i)
End If
Next
End Sub
Private Sub servidor_DataArrival_(ByVal bytesTotal As Long)
Dim datos As String
servidor(i).GetData datos, vbString, bytesTotal
TxtOutput.Text = datos
If TxtOutput.Text <> "" Then
MsgBox "Mensaje recibido del cliente" + servidor(i).RemoteHostIP
servidor(i).SendData ("Mensaje recibido")
TxtOutput.Text = datos
End Sub
///////////////////////////////////////////////////////////////////////////////
CONTRASEÑA
Private Sub cmdaceptar_Click()
If txtlogin.Text = "" Or txtpassword.Text = "" Then
MsgBox "Debe ingresar los datos"
End If
Data1.Recordset.MoveFirst
While Not Data1.Recordset.EOF
If txtlogin.Text = Data1.Recordset("NICK") Then
If txtpassword.Text = Data1.Recordset("PASSWORD") Then
frmclient.Show
frmclient.Caption = "Inciando sesion de: " & Data1.Recordset("NICK")
End If
End If
Data1.Recordset.MoveNext
Wend
MsgBox "No existe ninguna cuenta de usuario relacionada a esos datos, verifique sus datos."
txtlogin.Text = ""
txtpassword.Text = ""
txtlogin.SetFocus
End Sub
Private Sub cmdcancelar_Click()
Unload Me
End Sub
//////////////////////////////////////////////////////////////////////////////
Gracias por la ayuda
:hitcomp:
-
Hola anna, para empezar que es esto?
cliente.RemoteHost = cliente.LocalIP
si tienes esto como va a conectar el cliente con el servidor? debe ser:
if Cliente.State<>sckclosed then Cliente.Close
Cliente.Protocol=TcpProtocol
Cliente.Conect IP_server,Port_server
de forma que ya hemos conectado el cliente con el servidor.Fale?
En el WINSOCK_DATAARRIVAL
para que tienes el Cliente.SendData enviar??????????????'
el DATAARRIVAL lo que hace es recoger los datos que le envia el servidor¡¡¡¡¡¡¡¡¡
Cuando pulses sobre cmdescuchar no hagas un Form_Activate haz un
CALL Form_Activate
ademas el servidor(0).Bind cambialo por el servidor(0).Port, ademas el servidor(0) no debe recibir datos, ya que es el que esta a la escucha, de forma que los que deben recibir y/o enviar datos son del 1 hacia arriva, fale?
No se, deberias recoger un ejemplo cliente servidor que deje hace tiempo por el chat, cualquier cosa por aki estoy, fale?
un saludo
:hippi:
-
Gracias por los consejos. Estoy bastante despistada. Se nota, ¿no?:hitcomp:
-
a ver si me podeis ayudar a mi, estoy intentando hacer un chat, muy sencillito, pero no me funciona, no se conectan, y no entiendo donde esta el error.
Aca te paso el codigo:
CLIENTE
Private Sub Command1_Click()
Winsock1.Connect "Pc8Compaq", 1145
End Sub
Private Sub Command2_Click()
Winsock1.SendData txtSend.Text
End Sub
Private Sub Form_Load()
' El nombre del control Winsock es tcpClient.
' Nota: para especificar un host remoto, puede usar
' la dirección IP (como "121.111.1.1") o
' el nombre "descriptivo" del equipo, como se muestra aquí.
Winsock1.RemoteHost = "200.1.49.63"
Winsock1.RemotePort = 1145
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Winsock1.GetData strData
txtOutPut.Text = strData
End Sub
--------------------------------------------------------------------------
SERVIDOR
Private Sub Command1_Click()
Winsock1.SendData txtSendData.Text
End Sub
Private Sub Form_Load()
Winsock1.LocalPort = 0 'selecciona un puerto de forma aleatoria
Winsock1.Listen 'crea el socket y lo establece a modo de escucha
Me.Show
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept requestID
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
' Declara una variable para los datos entrantes.
' Invoca el método GetData y establece la propiedad
' Text de un control TextBox llamado txtOutput
' con los datos.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
Desde ya muchas Gracias!! :hola:
-
Pues como crees que te va a funcionara, el error es sencillo, en el servidor tienes esto:
Winsock1.LocalPort = 0 'selecciona un puerto de forma aleatoria
o sea que se selecciona un puerto aleatorio, cosa que el cliente no sabrá que puerto eligió el servidor, y no conecta pk el puerto no es el mismo, supongamos que el servidor eligió el puerto 10000 y el cliente trata de conectar con el puerto 1145 (como lo tienes en el codigo del cliente) pues nunca podrá conectarse
sustituye la linea que puse arriba por esta linea:
Winsock1.LocalPort = 1145 y así el servidor estará esperando conexiones por el puerto 1145 que es el que usa el cliente
Espero te sirva, de cualquier modo probaré el código para ver que otro error puede tener ;)
-
Aqui subo el código corregido bro
****PROGRAMA CLIENTE****
Private Sub Command1_Click()
Winsock1.Connect "Pc8Compaq", 1145 'Se conecta al equipo llamado "Pc8Compaq" donde está el programa servidor por medio del puerto 1145 que es el que está escuchando el servidor
End Sub
Private Sub Command2_Click()
Winsock1.SendData txtSend.Text
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock1.GetData strdata
txtOutPut.Text = strdata
End Sub
****PROGRAMA SERVIDOR****
Private Sub Command1_Click()
Winsock1.SendData txtSendData.Text 'Envía datos del "txtSendData" al cliente
End Sub
Private Sub Form_Load()
Winsock1.LocalPort = 1145 'Establece que el socket esperará conexiones por el puerto 1145
Winsock1.Listen 'Pone el socket a la espera de conexiones
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock1.Accept requestID
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock1.GetData strdata 'Almacena los datos recibidos en la variable strdata
txtOutPut.Text = strdata
End Sub
Listo, ese chat ya es funcional ;)
Ya si quieres hacer que al servidor se le conecten varios clientes, nadamás dime y te paso el código, suerte :P
-
Pues a mi si me interesa el chat con varios clientes, si pudieras pasarme el codigo, te lo agradeceria mucho, me ahorrarias mucho tiempo, yo tengo algo pensado como hacerlo, pero ahora mismo no me da mucho tiempo por mi trabajo, y necesito algo de esto de todas formas, mi correo es fap1603@hotmail.com. Gracias.
-
Bueno FAP aquí subo el código, haciendo notar que en este los clientes solo pueden enviar mensajes al servidor y no a otros clientes, el servidor al enviar un mensaje lo envía a todos los clientes, esta característica la podrias usar para hacer una rutina que envíe un mensaje al servidor con la ip destino para poder enviar mensajes de cliente a cliente, o sea haciendo al servidor como si fuera un servidor de mensajes :huh: