2014-10-22 6 views
0

클라이언트 (PHP) 서버 (Java) 환경입니다. PHP가 약 40k 문자 길이의 웹 페이지를 요청할 때 자바 측 (out.flush()에 의해)에서 다음과 같은 예외가 발생합니다. 나는 예외없이이 아키텍처를 여러 번, 여러 번 사용했습니다. 결과적으로 페이지가 표시되지만 완전히 표시되지는 않습니다. 여기 피어의 연결 재설정

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) 

는 요청을하고 자바 서버에서 응답을 읽는 PHP 코드 모든 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"); 
} 

에 대한 응답으로 특정 문자열을 전송하는 자바 코드이다

$SEPARATOR='[email protected]!!'; 
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; 

답변

1

"피어에 의한 연결 재설정"은 닫힌 소켓에 쓰려고 시도했음을 의미합니다. socket_read 함수는 한 번에 소켓의 모든 데이터를 읽지 않으며 서버가 모든 것을 기록하기 전에 소켓을 닫습니다. 모든 것을 읽으려면 루프가 필요하며 올바르게 작동하지 않는 클라이언트 때문에 서버에서 예외를 처리 할 준비가되어 있어야합니다.

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

당신이 "하나가 이동"으로 무엇을 의미합니까 : 예를 들어

? 운좋게도 PHP 부분은 3 부에서 개발되었으므로 이해할 수 없습니다. – mark

+0

'socket_read'는 응용 프로그램의 수신 버퍼에있는 패킷을 반환합니다. 이는 아마 몇 패킷 일 것입니다. 클라이언트가 서버가 보내는 모든 것을 읽어야한다면,'read' 호출을 반복해야합니다. – Joni