Доброго времени суток,господа.
Недавно столкнулся с такой интересной вещью как
сокеты и решил написать чат,чтобы лучше разобраться в этом вопросе.
Что получилось:
Написал сервер,который создает сокет,получает ip,прослушивает/привязывает соединения.
Написал клиент,который коннектится к серверу.
Сервер:
set_time_limit(0);
$address = "127.0.0.1";
$port = 1000;
try {
echo 'Create socket ... ';
$socket_desc = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//Создаем сокет.Получаем дескриптор для соединения.
if (!$socket_desc) {
throw new Exception('Ошибка создания сокета'.socket_last_error());
}
echo "Bind socket....";
if(!socket_bind($socket_desc,$address,$port)){//Привязываем полученный дескриптор к ip ресурс.
throw new Exception('Ошибка привязки сокета'.socket_last_error());
}
echo "Listen socket....";
if(!socket_listen($socket_desc)){//Прослушиваем соединение на сокете
throw new Exception('Ошибка послушки сокета'.socket_last_error());
}
echo "Accept socket....";
do{
$accept_socket = socket_accept($socket_desc);//Принимаем соединение.
if(!$accept_socket){
throw new Exception('Невозможно принять соединение'.socket_last_error());
}
$id = uniqid('user_');
$msg = "Hello $id\n";
socket_write($accept_socket, $msg);
}
while(true);
socket_close($socket_desc);//Закрываем сокет
}
catch(Exception $e){
echo $e->getMessage();
}
Клиент:
$address = "127.0.0.1";
$port = 1000;
try{
$client_socket_desc = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//Создаем сокет.Получаем дескриптор для соединения.
if (!$client_socket_desc) {
throw new Exception('Ошибка создания сокета'.socket_strerror(socket_last_error()));
}
echo 'Соединение с сервером ... ';
if (!socket_connect($client_socket_desc,$address,$port)) {
throw new Exception('Ошибка соединения с сервером'.socket_last_error());
}
$txt = socket_read($client_socket_desc,2096,PHP_NORMAL_READ);//Зачитываем буфер сокета (Привет user_*********)
echo $txt;
socket_close($client_socket_desc);
}
catch(Exception $e){
echo $e->getMessage();
}
Что не получилось:
Не совсем ясна логика отправки сообщений клиентов,т.е. пока вариант такой:
У нас есть поле ввода(обыкновенній input),откуда мы аяксом дергаем данные в скрипт.Полученные данные записываем в сокет(на сервере) и читаем/выводим через сокет клиента.
Насколько это верно?? Можно ли обойтись без аякса,реализовать это через сокеты?
Офтоп
Чем отличаются TCPсокеты (которые я сейчас использую) от WebSockets,что лучше? Не смог найти внятного объяснения(
Благодарю за уделенное время.