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

Imágen de perfil

Chat para consola desarrollado con PHP utilizando socketsgráfica de visualizaciones


PHP

estrellaestrellaestrellaestrellaestrella(3)
Publicado el 21 de Marzo del 2016 por xve
1.432 visualizaciones desde el 21 de Marzo del 2016. Una media de 42 por semana
Este código genera un servidor de chat por un puerto indicado, al cual se puede conectar cualquier usuario utilizando el comando telnet.

Requerimientos

Es necesario disponer del PHP5 instalado

Desarrollado sobre Linux...

Versión 1.0
estrellaestrellaestrellaestrellaestrella(3)

Publicado el 21 de Marzo del 2016gráfica de visualizaciones de la versión: Versión 1.0
1.433 visualizaciones desde el 21 de Marzo del 2016. Una media de 42 por semana
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 (3)

Imágen de perfil
gilberto
21 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
Muy interesante!!! gracias
Responder
Imágen de perfil
Estela
22 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
Como puedo insertarlo en mi web?
Responder
Imágen de perfil
xve
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

Comentar la versión: Versión 1.0

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

http://lwp-l.com/s3471