В настоящее время я пытаюсь разработать сценарий PHP, используемый в качестве общедоступной части клиент-серверного приложения. Сценарий php должен использоваться для аутентификации пользователей с помощью одноразового токена.
Другая часть приложения — это Java-программа, которая предлагает сокет telnet для подключения других приложений. Аутентификация осуществляется через это соединение telnet.
Java-часть уже работает, но у меня все еще есть огромная проблема с PHP-частью.
В php я открыл соединение с портом telnet программы java, которая работает до сих пор. После того, как соединение инициализировано, java-программа ожидает ввода от PHP-скрипта для аутентификации пользователя.
После того как процесс аутентификации завершен, он возвращает строку в скрипт PHP (или любую другую программу, подключенную к его серверу telnet), которую должен вывести скрипт PHP.
Прежде чем я объясню свою проблему, это часть PHP-скрипта, где происходит фактическое общение:
$tnconn = fsockopen("localhost", 53135, $errno, $errstr, 2);
if(!$tnconn) {
echo "SERVER_UNAVAILABLE";
die();
} else {
$data = $p_ip." ".$p_name." ".$p_token;
fputs($tnconn, $data);
while (true) {
if(($telnet_response = fgets($tnconn)) == false) {
break;
}
}
}
echo $telnet_response;
Кажется, что fputs()
Оператор выполняется после цикла, даже если это должно произойти до его запуска — иначе приложение Java не может получить данные, которые передаются в сценарий php, но это необходимо для аутентификации пользователей.
Сразу после получения данных сервер telnet выводит строку, чтобы указать, была ли аутентификация успешной или нет.
Я попытался временно удалить цикл, и данные были успешно переданы с fputs()
поэтому я предполагаю, что php ждет завершения всего скрипта и затем выполняет функцию.
Как я могу заставить его отправлять данные перед циклом?
Заранее спасибо.
Проблема, вероятно, в том, что вам нужно отправить \n
в конце вашей строки данных, чтобы сервер telnet знал, что вы отправили полную последовательность данных. В противном случае он, скорее всего, сидит в ожидании большего ввода.
Пытаться:
$data = $p_ip." ".$p_name." ".$p_token . "\n";
Других решений пока нет …