2012-11-21 2 views
2

PHP로 소켓을 사용하여 간단한 명령 행 기반 채팅을 만듭니다. 그것은 정상적으로 작동하지만, 거의 사용 불가능하게 만드는 주요한 문제가 있습니다. 채팅에 여러 사람이 있고 한 사람이 메시지를 입력하고 다른 사람이 메시지를 보내는 경우 메시지를 입력하는 사람은 입력 내용에 첨부 된 메시지를받습니다. 이 주변에 어쨌든 있습니까? stdin 및 stream select를 사용하고 있습니다. 다음은 고객의 작품입니다.받은 데이터에 추가 된 PHP 소켓

$uin = fopen("php://stdin", "r"); 
while (true) { 
    $r = array($socket, $uin); 
    $w = NULL; 
    $e = NULL; 

    if (0 < stream_select($r, $w, $e, 0)) { 
    foreach ($r as $i => $fd) { 
     if ($fd == $uin) { 
     $text = (fgets($uin)); 
     fwrite($socket, $text); 
     } else { 
     $text = fgets($socket); 
     print $text; 
     } 
    } 
    } 
} 

모든 도움을 주실 수 있습니다! 감사!

+1

화면 관리 라이브러리를 사용하여 입력을 읽는 중 화면의 다른 부분에 출력을 표시합니다. – Barmar

답변

0

$ socket에서 전체 문자열이 대기 할 때마다 코드는 stdout에 메시지를 출력합니다.

이 문제를 해결하는 유일한 방법은 텍스트를 인쇄하는 대신 변수 ($ outtext)에 넣는 것입니다. 당신은 그런 나가는 소켓에 쓰기 전에, 그것은을 읽을 준비가 될 때마다 그럼 당신은 ...

$uin = fopen("php://stdin", "r"); 
while (true) { 
    $r = array($socket, $uin); 
    $w = NULL; 
    $e = NULL; 
    $outtext = ''; 

    if (0 < stream_select($r, $w, $e, 0)) { 
    foreach ($r as $i => $fd) { 
     if ($fd == $uin) { 
     $text = (fgets($uin)); 
     print $outtext; 
     $outtext = ''; 
     fwrite($socket, $text); 
     } else { 
     $text = fgets($socket); 
     $outtext .= $text; 
     } 
    } 
    } 
} 

Enter 키를 누르면이 들어오는 텍스트를 표시하는 것 인 단점을 표시 할 수 있습니다. 그 주위의 유일한 방법은 fgets() 이외의 것을 사용하는 것입니다.

나는 Node.js 또는 이와 유사한 이벤트 구동 프로그래밍이이 유형의 경우에 훨씬 더 좋을 것이라고 가정하고 있습니다.