я и его друг в последние пару дней возились с сокетами 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 отсутствует.