Código de PHP - Chat para consola desarrollado con PHP utilizando sockets

Requerimientos

Es necesario disponer del PHP5 instalado

Desarrollado sobre Linux...

Versión 1.0
estrellaestrellaestrellaestrellaestrella(6)

Publicado el 21 de Marzo del 2016gráfica de visualizaciones de la versión: Versión 1.0
6.011 visualizaciones desde el 21 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

Para ejecutar el servidor, hay que indicar la IP del servidor donde se ejecuta el script en la variable $address. Una vez especificada la IP y puerto, hay que ejecutar el código desde la consola o terminal con:
php -f chat.php

Para conectarse desde los clientes:
telnet ip puerto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
/**
Chat para consola desarrollado con PHP

Para iniciar el servidor ejecutar:
	php -f archivo.php

Para conectarse al servidor ejecutar:
	telnet ip puerto (telnet 127.0.0.1 10000)

http://www.lawebdelprogramador.com
**/
 
error_reporting(E_ALL);
 
/* Permitir al script esperar para conexiones. */
set_time_limit(0);
 
// Activar el volcado de salida implícito, así veremos lo que estamos obteniendo
// mientras llega
ob_implicit_flush();
 
// definimos la dirección y puerto que espera conexiones
$address = '127.0.0.1';
$port = 10000;
 
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
	echo "socket_create() falló: razón: ".socket_strerror(socket_last_error())."\n";
}
 
if (socket_bind($sock, $address, $port) === false) {
	echo "socket_bind() falló: razón: ".socket_strerror(socket_last_error($sock))."\n";
}
 
if (socket_listen($sock, 5) === false) {
	echo "socket_listen() falló: razón: ".socket_strerror(socket_last_error($sock))."\n";
}else{
	echo "\nChat en funcionamiento... se pueden conectar con:\n\ttelnet $address $port\n\n";
}
 
// array de clientes conectados
$clientes = array();
 
$write=NULL;
$except=NULL;
 
do {
	$read = array();
	$read[] = $sock;
 
	// jutamos el array del socket con los clientes
	$read = array_merge($read,$clientes);
 
	// comprobamos si algo cambia en algunos de los sockets abiertos
	// si $socketsCambiados tiene valor, la variable $read contendra los sockets
	// que se han modificado
	$socketsCambiados=socket_select($read, $write, $except, 5);
	if($socketsCambiados==0)
	{
		continue;
	}
 
	// Nuevas conexiones
	// unicamente son nuevas conexiones cuando $sock se encuentra en la variable
	// $read modificada por socket_select()
	if(in_array($sock, $read))
	{
		if (($msgsock = socket_accept($sock)) === false) {
			echo "socket_accept() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
			break;
		}
 
		// añadimos el cliente al listado
		$clientes[] = $msgsock;
 
		// obtenemos el numero de cliente para $msgsock
		$key = array_keys($clientes, $msgsock);
 
		// enviamos el mensaje de bienvenida al cliente
		$msg = "\nBienvenido al Servidor De Prueba de PHP. \n" .
		"Usted es el cliente numero: ".($key[0]+1)."\n" .
		"Para salir, escriba 'quit'. Para cerrar el servidor escriba 'shutdown'.\n";
		socket_write($msgsock, $msg, strlen($msg));
 
		// Mostramos el numero de usuario conectados al chat
		echo "\nHay ".count($clientes)." clientes conectados\n";
	}
 
	// Gestionamos las entradas de texto
	// recorremos cada uno de los clientes activos
	foreach ($clientes as $key => $client)
	{
 
		// si hay algun cliente en la variable $read devuelta por la función
		// socket_select(), quiere decir que ha enviado datos
		if (in_array($client, $read))
		{
 
			// leemos los datos
			if (false === ($buf = socket_read($client, 2048, PHP_NORMAL_READ))) {
				echo "socket_read() falló: razón: " . socket_strerror(socket_last_error($client)) . "\n";
				break 2;
			}
			if (!$buf = trim($buf)) {
				continue;
			}
			if ($buf == 'quit') {
				echo "\nEl cliente ".($key+1)." dejo el chat\n";
 
				// quitamos el clientes del array
				unset($clientes[$key]);
 
				// cerramos el socket con el cliente
				socket_close($client);
				break;
			}
			if ($buf == 'shutdown') {
				socket_close($client);
 
				// salimos del foreach() y del do{}
				break 2;
			}
 
			// reenviamos a todos los clientes conectados el mensaje del usuario
			$talkback = "Cliente ".($key+1)." dijo: $buf\n";
			foreach($clientes as $keyWrite=>$clientWrite)
			{
				if($keyWrite!=$key)
				{
					// enviamos el texto...
					socket_write($clientWrite, $talkback, strlen($talkback));
				}
			}
 
			// mostramos lo que hemos recibido
			echo "Cliente ".($key+1)." dijo: $buf\n";
		}
	}
} while (true);
 
// cerramos el socket en el servidor
socket_close($sock);
?>



Comentarios sobre la versión: Versión 1.0 (6)

Imágen de perfil
21 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
Muy interesante!!! gracias
Responder
Imágen de perfil
22 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
Como puedo insertarlo en mi web?
Responder
Imágen de perfil
26 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
Aquí tienes el chat para web:
http://www.lawebdelprogramador.com/codigo/PHP/3481-Chat-para-web-realizado-con-PHP-utilizando-WebSockets.html
Responder
5 de Octubre del 2020
estrellaestrellaestrellaestrellaestrella
No ha dejado ningún comentario
Responder
sergio sanchez
5 de Mayo del 2021
estrellaestrellaestrellaestrellaestrella
como puedo hacer el chat con login inicial asi como esta ese por consola ?
Responder
zaer00t
12 de Mayo del 2021
estrellaestrellaestrellaestrellaestrella
aunque es super mega viejo este post, pero es un copy and paste de php.net
Responder

Comentar la versión: Versión 1.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s3471