Java — соединение сбрасывается по пиру

Речь идет о клиентской (PHP) серверной (Java) среде. Я получаю следующее исключение на стороне Java (out.flush ()), когда php запрашивает веб-страницу длиной около 40 тыс. Символов. Я использовал эту архитектуру много раз, не получая никаких исключений. В результате страница отображается, но не полностью.

java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at sitodove.core.net.Connection.writeMessage(Connection.java:79)
at sitodove.core.net.FrontendConnection.run(FrontendConnection.java:149)

Вот код Java, который отправляет определенную строку в ответ на каждый запрос PHP

    public void writeMessage(String message) throws IOException
{
Logger.log("writeMessage, Valore in entrata: "+message);
int messageLength=message.length();
String startingNumber=""+messageLength;
StringBuffer prefix=new StringBuffer(""+messageLength);
for(int i=0;i<PROTOCOL_PREFIX_LENGTH-startingNumber.length();i++)
prefix.insert(0, "0");
prefix.append(message);
Logger.log("writeMessage, Valore in uscita: "+prefix);
out.write(prefix.toString());
out.flush();
Logger.log("DATI INVIATI");
}

Вот код PHP, который делает запрос и читает ответ с сервера Java

$SEPARATOR='!!@!!';
function communicate($remoteServer, $remotePort, $outText)
{
$outTextLength = strlen($outText);
$lengthPaddedPrefix = str_pad($outTextLength, 8, "0", STR_PAD_LEFT);
$message = $lengthPaddedPrefix.$outText;

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket");
socket_connect($socket, $remoteServer, $remotePort) or  header( 'Location: /maintenance/' );

socket_write($socket, $message, strlen($message)) or  header( 'Location: /maintenance/' );
//echo 'COMUNICATO';
$response = socket_read($socket, 20000000) or  header( 'Location: /maintenance/' );

socket_close($socket);

if (strpos($response, "JAVA is not responding") !== false) {
die("Site is down for maintenance");
}
return substr($response, 8);
}

$coreanswer=$coreanswer=communicate('localhost', 6527, "showreport".$SEPARATOR.$_GET['uid'].$SEPARATOR.$_GET['wid'].$SEPARATOR.$_GET['getime'].$SEPARATOR.$_GET['rct']);
echo $coreanswer;

0

Решение

«Сброс соединения по пиру» означает, что вы пытались записать в закрытый сокет. socket_read Функция не считывает все данные из сокета за один раз, и вы заканчиваете тем, что закрываете сокет до того, как сервер завершит запись всего. Вам нужен цикл, чтобы прочитать все, а также быть готовым обработать исключение на сервере из-за клиентов, которые ведут себя неправильно.

Например:

$data = "";
do {
$data = socket_read($socket, 20000000);
if ($data === FALSE) {
// socket read error
header( 'Location: /maintenance/' );
break;
}
$response .= $data;
} while ($data);
1

Другие решения

Других решений пока нет …