PHP и Java сокет связи.socket_read () зависает - PullRequest
0 голосов
/ 15 октября 2018

я и его друг в последние пару дней возились с сокетами PHP, пытаясь заставить его взаимодействовать с сокетом Java-сервера.Мы испробовали несколько различных методов / решений и просмотрели довольно много похожих проблем / решений, но безрезультатно.

Для кода, который у меня есть (поскольку я не помню все изменения, которые я сделал или попробовал),socket_send () работает, и java-сервер получает сообщение.Но что интересно, если socket_read () находится в PHP-файле, последним выводом на консоль java будет «Client response: ...», но если socket_read () закомментирован, он проходит через всю java-программу.

Я не совсем уверен, почему это происходит, но я предполагаю, что это причина того, что данные не считываются в скрипт PHP.Я знаю, что он достигает кода socket_read (), потому что, если я принудительно закрываю сервер, я получаю «Предупреждение: socket_read (): невозможно прочитать из сокета [10054]: существующее соединение было принудительно закрыто удаленным хостом».

PHP-файл

<?php 
$host = "localhost";
$port = 1000;

echo "Creating Socket...<br>";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket");

echo "Connecting to host...<br>";
$connection = socket_connect($socket,$host,$port) or die("Could not connect to host");

$message ="Message to send".PHP_EOL;
socket_send($socket,$message,strlen($message),0);

sleep(10);
echo "Done sleep";
while (($buffer = socket_read($socket, 1024))!=false) {
    echo("Data sent was:" . $buffer . "<br>");
}

socket_close($socket);
?>

Java-файл

try {
    ServerSocket serverSocket = new ServerSocket(1000);

    Socket currentClient = null;
    while(currentClient == null) {
        try {
            // accepts incoming socket connection
            currentClient = serverSocket.accept();
            if(currentClient!=null) {
                System.out.println("Client Connected: " + currentClient);

                //create streams for socket
                OutputStream out = currentClient.getOutputStream();
                PrintWriter os = new PrintWriter(new OutputStreamWriter(out));
                    BufferedReader br = new BufferedReader(new InputStreamReader(currentClient.getInputStream()));

                String line = null;
                while ((line = br.readLine()) != null) {
                    System.out.println("Client response: " + line);
                }

                System.out.println("Writing to os");
                os.println("Hello world\r\n");

                System.out.println("flushing OS");
                os.flush();

                System.out.println("Done");

                os.close();
                out.close();
                br.close();
                currentClient.close();
            }

        }catch(Exception ex){
            currentClient.close();
            ex.printStackTrace();
        }
    }
    serverSocket.close();
} catch (IOException e) {
    e.printStackTrace();
}

EDIT я удалил цикл while вфайл Java, и теперь он работает, что странно, но я не приму его за временное исправление.очевидно, что если отправлено несколько строк, будет прочитана только первая строка.Все еще не уверен, почему это работает, если socket_read отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...