bueno bueno... de nuevo... ya q entre antes me decidi a poner el chat... lo cambie mucho desde el ultimo post ya q encontre una web en la q habia un manual para hacer un chat bastante basico y yo lo modifique
el manual original es de:
http://www.monografias.com/trabajos30/tutorial-visual-basic/tutorial-visual-basic.shtml
bueno pongo aca los form:
Cliente:
textbox1, scroll vertical, funcion multiline
textbox2
commandbutton1, caption "Enviar"
commandbutton4, caption "Conectar"
commandbutton3, captio "Desconectar", enabled = false
timer1
winsock1
Dim ip As String, puerto As Long, nick As String, c As Byte
Private Sub Command2_Click()
Command2.Enabled = False
Command3.Enabled = True
'asignamos los datos de conexion
'conectamos el socket
Winsock1.Connect ip, puerto
End Sub
Private Sub Form_Load()
nick = InputBox("Ingrese su nick", "Nick")
ip = "127.0.0.1"
puerto = 23
a = 1
c = 0
End Sub
Private Sub Text2_Change()
If Text2.Text = "" Then
Command1.Enabled = False
Else
Command1.Enabled = True
End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Command1_Click
End Sub
Private Sub Timer1_Timer()
c = c + 1
Select Case c
Case 1
Form1.Left = Form1.Left + 40
Form1.Top = Form1.Top + 65
Beep
Case 2
Form1.Left = Form1.Left - 52
Form1.Top = Form1.Top + 69
Beep
Case 3
Form1.Left = Form1.Left + 30
Form1.Top = Form1.Top - 32
Beep
Case 4
Form1.Left = Form1.Left + 25
Form1.Top = Form1.Top + 50
Beep
Case 5
Form1.Left = Form1.Left + 40
Form1.Top = Form1.Top + 65
Beep
Case 6
Form1.Left = Form1.Left - 52
Form1.Top = Form1.Top + 69
Beep
Case 7
Form1.Left = Form1.Left + 30
Form1.Top = Form1.Top - 32
Beep
Case 8
Form1.Left = Form1.Left - 90
Form1.Top = Form1.Top - 130
Beep
Timer1.Interval = 0
c = 0
End Select
End Sub
Private Sub Winsock1_Connect()
'desplegamos un mensaje en la ventana
Text1.Text = Text1.Text & _
"*** Conexion establecida." & vbCrLf
'desplazamos el scroll
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Winsock1_Close()
'cierra la conexion
Winsock1.Close
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Conexion cerrada por Agustín." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Command3_Click()
Command3.Enabled = False
Command2.Enabled = True
'cierra la conexion
Winsock1.Close
'desplegamos un mensaje en la ventana
Text1.Text = Text1.Text & _
"*** Conexion cerrada por el usuario." & vbCrLf
'desplazamos el scroll
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Command1_Click()
If Winsock1.State = 7 Then
'enviamos el contenido de Text2
Winsock1.SendData nick & "> " & Text2.Text
Text2.Text = ""
Else
Text1.Text = Text1.Text & "***Debes establecer una conexión primero." & vbCrLf
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Beep
Dim Buffer As String 'variable para guardar los datos
'obtenemos los datos y los guardamos en una variable
Winsock1.GetData Buffer
If Buffer = "Servidor> zumbido" & vbCrLf Then
Timer1.Interval = 100
End If
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & Buffer 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'cerramos la conexion
Winsock1.Close
If Number = 10061 Then
Text1.Text = Text1.Text & "***No has podido conectarte con el servidor ya que este no esta conectado." & vbCrLf
Command2.Enabled = True
Command3.Enabled = False
Else
'mostramos informacion sobre el error
MsgBox "Error numero " & Number & ": " & Description, vbCritical
End If
End Sub
Servidor:
textbox1, scroll vertical, funcion multiline
textbox2
commandbutton1, caption "Enviar"
commandbutton4, caption "Escuchar"
commandbutton3, captio "Desconectar", enabled = false
timer1
winsock1
winsock2, index 0
Private Sub Command2_Click()
Command2.Enabled = False
Command3.Enabled = True
'cerramos cualquier conexion previa
Winsock1.Close
'asignamos el puerto local que abriremos
Winsock1.LocalPort = 23
'deja el socket esuchando conexiones
Winsock1.Listen
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Esuchando conexiones." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Command3_Click()
Command3.Enabled = False
Command2.Enabled = True
'cierra la conexion
Winsock1.Close
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Conexion cerrada por el usuario." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Text2_Change()
If Text2.Text = "" Then
Command1.Enabled = False
Else
Command1.Enabled = True
End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Command1_Click
End Sub
Private Sub Winsock1_Close()
'cierra la conexion
Winsock1.Close
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Conexion cerrada por el Servidor." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'cerramos la conexion
Winsock1.Close
'mostramos informacion sobre el error
MsgBox "Error numero " & Number & ": " & Description, vbCritical
End Sub
Private Sub Command1_Click()
Dim numElementos As Integer 'numero de sockets
Dim i As Integer 'contador
'obtiene la cantidad de Winsocks que tenemos
numElementos = Winsock2.UBound
'recorre el arreglo de sockets
For i = 0 To numElementos
'si el socket se encuentra conectado...
If Winsock2(i).State = sckConnected Then
'enviamos el contenido de Text2
Winsock2(i).SendData "Servidor> " & Text2.Text & vbCrLf
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & "Servidor> " & Text2.Text & vbCrLf 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
End If
Next
'borramos Text2
Text2.Text = ""
End Sub
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Beep
Dim Buffer As String 'variable para guardar los datos
'obtenemos los datos y los guardamos en una variable
Winsock2(Index).GetData Buffer
'apuntamos al final del contenido del TextBox e
'insertamos los nuevos datos obtenidos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Text1.Text = Text1.Text & Buffer & vbCrLf 'mostramos los datos
Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido
Dim cant As Integer
Dim c As Integer
cant = Winsock2.UBound
For c = 0 To cant
If Winsock2(c).State = sckConnected Then
Winsock2(c).SendData Buffer & vbCrLf
End If
Next
End Sub
Private Sub Winsock2_Close(Index As Integer)
'cierra la conexion
Winsock2(Index).Close
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "Sock" & Index & ":*** Conexion cerrada por el Cliente." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub Winsock2_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'cerramos la conexion
Winsock2(Index).Close
'mostramos informacion sobre el error
MsgBox "Error numero " & Number & ": " & Description, vbCritical
End Sub
'Carga un nuevo socket al arreglo y devuelve su indice
Private Function NuevoSocket() As Integer
Dim numElementos As Integer 'numero de sockets
Dim i As Integer 'contador
'obtiene la cantidad de Winsocks que tenemos
numElementos = Winsock2.UBound
'recorre el arreglo de sockets
For i = 0 To numElementos
'si algun socket ya creado esta inactivo
'utiliza este mismo para la nueva conexion
If Winsock2(i).State = sckClosed Then
NuevoSocket = i 'retorna el indice
Exit Function 'abandona la funcion
End If
Next
'si no encuentra sockets inactivos
'crea uno nuevo y devuelve su identidad
Load Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo
'devuelve el nuevo indice
NuevoSocket = Winsock2.UBound
End Function
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Beep
Dim numSocket As Integer 'el numero del socket
'mostramos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "*** Peticion numero " & requestID & vbCrLf
Text1.SelStart = Len(Text1.Text)
'creamos un nuevo socket
numSocket = NuevoSocket
'aceptamos la conexion con el nuevo socket
Winsock2(numSocket).Accept requestID
'desplegamos un mensaje en la ventana
Text1.SelStart = Len(Text1.Text)
Text1.Text = Text1.Text & "Sock" & numSocket & ":*** Conexion aceptada, listo para interactuar." & vbCrLf
Text1.SelStart = Len(Text1.Text)
End Sub
explico un poco...
*el cliente se conecta con el server
*cuando un cliente envia un dato no se agrega directamente al text1 si no q se manda al server y este lo vuelve a enviar... esto lo hice para q si hay mas de un cliente todos vean todo... y asi poder hablar entre muchos todos juntos
*el servidor si envia la palabra "zumbido" les envia un zumbido a todos los clientes
*bueno... les parecera raro q tenga dos winsock ya q la mayoriria de los programas tienen uno les explico el winsock1 queda siempre a la escucha y cuando capta una nueva conecxion le designa un puerto en el winsock2 y vuelve a quedarse a la escucha
*presionando enter se envia el texto
no se q mas... cualquier duda preguntenme o sugerencia...
tb pueden consultar el link ya q repito q es una modificacion de un manual... el link lo saque de este foro... pero no me acuerdo de donde...
pueden bajar el archivo de aca:
http://rapidshare.com/files/23274763/Mini_Chat.rarespero no olvidarme nada
SALUDOS::