Programación General > Visual Basic 6.0 e inferiores

 Re: ¿Donde esta el error?

(1/2) > >>

Anna:
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:

HurryCrack:
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:

Anna:
Gracias por los consejos. Estoy bastante despistada. Se nota, ¿no?:hitcomp:

solcito:
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:

martin campos quintero:
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  ;)

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa