Ashlst
@Ashlst
Фанат эстетики и красивых решений.

Чат на socket.Логика отправки сообщений?

Доброго времени суток,господа.
Недавно столкнулся с такой интересной вещью как сокеты и решил написать чат,чтобы лучше разобраться в этом вопросе.
Что получилось:
Написал сервер,который создает сокет,получает 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,что лучше? Не смог найти внятного объяснения(

Благодарю за уделенное время.
  • Вопрос задан
  • 741 просмотр
Решения вопроса 2
DevMan
@DevMan
Можно ли обойтись без аякса,реализовать это через сокеты?
чтоб что-то отправить в сокет вам нужно это как-то получить из браузера.

Чем отличаются TCPсокеты (которые я сейчас использую) от WebSockets,что лучше?
что лучше зависит от задачи.
по отличиям можете почитать:
stackoverflow.com/questions/2681267/what-is-the-fu...
stackoverflow.com/questions/16945345/differences-b...
eng.kifi.com/websockets-vs-regular-sockets
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Чем отличаются TCPсокеты (которые я сейчас использую) от WebSockets,что лучше?


websockets - это протокол, который позволяет вам организовать соединение с сервером. websockets работают поверх TCP и это единственный способ открыть двусторонний канал с сервером (ну как... еще WebRTC предоставляет P2P каналы, но это чуть другая плюшка).

откуда мы аяксом дергаем данные в скрипт.

смысл тогда в сокетах?

Можно ли обойтись без аякса,реализовать это через сокеты?

websockets и есть ответ на ваш вопрос.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы