За последние 24 часа нас посетили 9616 программистов и 685 роботов. Сейчас ищут 249 программистов ...

Проблема кодировки сервера

Тема в разделе "PHP для новичков", создана пользователем Sasha55555, 14 мар 2019.

  1. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    143
    Симпатии:
    0
    Код (Text):
    1. <?php
    2.     header('Content-Type: text/plain;'); //Мы будем выводить простой текст
    3.     set_time_limit(0); //Скрипт должен работать постоянно
    4.     ob_implicit_flush(); //Все echo должны сразу же отправляться клиенту
    5.     $address = 'localhost'; //Адрес работы сервера
    6.     $port = 11111; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
    7.     if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
    8.         //AF_INET - семейство протоколов
    9.         //SOCK_STREAM - тип сокета
    10.         //SOL_TCP - протокол
    11.         echo "Ошибка создания сокета";
    12.     } else {
    13.         echo "Сокет создан\n";
    14.     }
    15.  
    16.     //Связываем дескриптор сокета с указанным адресом и портом
    17.     if (($ret = socket_bind($sock, $address, $port)) < 0) {
    18.         echo "Ошибка связи сокета с адресом и портом";
    19.     } else {
    20.         echo "Сокет успешно связан с адресом и портом\n";
    21.     }
    22.  
    23.     //Начинаем прослушивание сокета (максимум 5 одновременных соединений)
    24.     if (($ret = socket_listen($sock, 5)) < 0) {
    25.         echo "Ошибка при попытке прослушивания сокета";
    26.     } else {
    27.         echo "Ждём подключение клиента\n";
    28.     }
    29.  
    30.     do {
    31.         //Принимаем соединение с сокетом
    32.         if (($msgsock = socket_accept($sock)) < 0) {
    33.             echo "Ошибка при старте соединений с сокетом";
    34.         } else {
    35.             echo "Сокет готов к приёму сообщений\n";
    36.         }
    37.    
    38.         //Бесконечный цикл ожидания клиентов
    39.         do {
    40.             $msg = null;
    41.             if (false === ($buf = socket_read($msgsock, 1024))) {
    42.                 echo "Ошибка при чтении сообщения от клиента";  
    43.             } else {
    44.                 echo 'Сообщение от клиента: '.$buf."\n";
    45.                 if ($buf == "<policy-file-request/>\0"){
    46.                     $msg = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"$port\" /></cross-domain-policy>\0"; // Crossdomain
    47.                     socket_write($msgsock, $msg, strlen($msg));
    48.                 }
    49.                 echo json_encode($buf, JSON_UNESCAPED_UNICODE);
    50.             }
    51.        
    52.             //Если клиент передал exit, то отключаем соединение
    53.             if ($buf == 'exit') {
    54.                 socket_close($msgsock);
    55.                 break 2;
    56.             }
    57.        
    58.             if ($msg != null) {
    59.                 echo "Сообщение от сервера: $msg\n";
    60.             }
    61.         } while (($buf = socket_read($msgsock, 1024)) == true);
    62.     } while (true);
    63.  
    64.     //Останавливаем работу с сокетом
    65.     if (isset($sock)) {
    66.         socket_close($sock);
    67.         echo "Сокет успешно закрыт";
    68.     }
    69. ?>
    Пробую подключиться клиентом к серверу.
    Вот клиент отправил пакет на сервер
    Код (Text):
    1. _instance.writeUnsignedInt(packet.length + 4);
    2. _instance.writeUnsignedInt(Connection.id++);
    3. _instance.writeBytes(packet);
    4. _instance.flush();
    5. _instance.pingTimer.reset();
    6. _instance.pingTimer.start();
    В клиенте вывожу значение пакета json enco-дом и выводит нормальную JSON строку
    Код (Text):
    1. {"type":10,"position":2,"shareable":false,"name":"HELLO","length":2,"bytesAvailable":0,"objectEncoding":3,"endian":"littleEndian"}
    Далее пробую выводить на сервере при помощи echo json_encode($buf, JSON_UNESCAPED_UNICODE); но получаю "\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u0000"
    Очень нужна помощь, спасибо!
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    1.289
    Симпатии:
    266
    Адрес:
    Татарстан
    помощь в чем?
    что вы думаете вам должно вывести то?
    попробуйте просто вывести echo $buf и посмотрите что это
     
  3. Sasha55555

    Sasha55555 Новичок

    С нами с:
    18 мар 2018
    Сообщения:
    143
    Симпатии:
    0
    Код (Text):
    1. Сообщение от клиента:
    выводит квадратик
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    1.289
    Симпатии:
    266
    Адрес:
    Татарстан
    ну судя по всему там последовательность байт какая то не интерпретируемая в текст .. типа служебные символы с ASCI кодом меньше 32
    и вообще зачем их выводить....