2012-12-16 1 views
8

나는 PHP 채팅을 만들려고 해요에서 채팅 클라이언트를 작성, 그래서 나는 client 연결을들을 수있는 터미널 서버, 시작 server.php 있습니다는 PHP

<?php 

function chat_leave($sock, $chat_id = 0) 
{ 
    if($chat_room_id[ $chat_id ]) 
    { 
     unset($chat_room_id[ $chat_id ]); 
     return true; 
    } 
    socket_close($sock); 
    return false; 
} 

function client($input) 
{ 
    /* 
    Simple php udp socket client 
    */ 

    //Reduce errors 
    error_reporting(~E_WARNING); 

    $server = '127.0.0.1'; 
    $port = 9999; 

    if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0))) 
    { 
     $errorcode = socket_last_error(); 
     $errormsg = socket_strerror($errorcode); 

     die("Couldn't create socket: [$errorcode] $errormsg \n"); 
    } 

    //Communication loop 
    while(1) 
    { 

     //Send the message to the server 
     if(! socket_sendto($sock, $input , strlen($input) , 0 , $server , $port)) 
     { 
      $errorcode = socket_last_error(); 
      $errormsg = socket_strerror($errorcode); 

      die("Could not send data: [$errorcode] $errormsg \n"); 
     } 

     //Now receive reply from server and print it 
     if(socket_recv ($sock , $reply , 2045 , MSG_WAITALL) === FALSE) 
     { 
      $errorcode = socket_last_error(); 
      $errormsg = socket_strerror($errorcode); 

      die("Could not receive data: [$errorcode] $errormsg \n"); 
     } 

     return $reply; 
    } 
} 
/* 
* chat_join 
* a new user joins the chat 
* @username: String 
* @password: String 
* 
* add a new listener to the server 
* 
*/ 
function chat_join($username = "", $password = "") 
{ 
    $users = array(
     "batman" => "batman123", 
     "robin" => "robin123", 
     "joe" => "joe123" 
    ); 
    if($users[$username] == $password) 
    { 
     return true; 
    } 

    return false; 
} 
function main() 
{ 
    $chat_room_id = array(); 

    $username = stripslashes($_POST['username']); 
    $password = stripslashes($_POST['password']); 
    $action = stripslashes($_POST['action']); 
    $port  = intval($_POST['port']); 
    $domain = stripslashes($_POST['domain']); 
    $chat_id = intval($_POST['chat_room_id']); 

    if(strcmp($action, "login") == 0) 
    { 
     $status = chat_join($username, $password); 
     if($status) 
     { 
      $chat_room_id[] = $chat_id; 
      echo json_encode($status); 
     } 
    } 
    else if(strcmp($action, "chat") == 0) 
    { 
     $msg = stripslashes($_POST['message']); 
     // take the message, send through the client 
     $reply = client($msg); 
     echo json_encode($reply); 
    } 
    else if(strcmp($action, "logout") == 0) 
    { 

    } 
    else 
    { 
     echo json_encode(false); 
    } 
    return; 
} 

main(); 

?> 

기능 client()를 내가 client.php 파일에서 가지고있는 코드입니다. 터미널에서 실행할 때 server.php에서 메시지를 보내고받을 수 있습니다. 이제 내 main.php 파일을 사용하고 싶습니다. 사용자가 로그인하면 서버에 메시지를 보내면 사용자가 보지 못한 메시지가 회신됩니다. 두 개의 다른 터미널에서 server.phpclient.php을 실행하면 메시지를 보내고받을 수 있지만 main.php을 사용하여 해당 응답 메시지를 JSON 개체로 변환하고 html 페이지로 다시 전송합니다. textarea 상자에 추가하십시오. 내 문제는 무엇입니까 : client.php이받은 답변을 html 페이지로 다시 보내려면 어떻게해야합니까? 내가 터미널에 그것을 실행하면 , 내가 가진 :

Enter a message to send : hello 
Reply : hello 

내가 채팅에서 사용자 입력을 보낼 AJAX를 사용, 그래서 나는 그 메시지를 취할 수, 서버에 보내 싶어하는 터미널에서 시작하여 답장을 웹 페이지로 되돌리고 앞으로 가져 와서 텍스트 상자 영역에 추가합니다. 어떻게해야합니까? main.php을 통해 서비스로 client.php을 시작해야합니까? 또는 client($input) 함수를 사용하여 메시지를 보낸 다음 보낸 메시지를 반환해야합니까? 그러나 다른 클라이언트가 채팅에 연결할 수 있기 때문에 사용이 로그 아웃 될 때까지 client이 실행되기를 원합니다. 어떻게 저를 위해 일종의 퍼지 일 수 있습니다 달성 할 수 있습니다. client($input)의 코드는 client.php과 동일합니다.

+0

http://stackoverflow.com/questions/2055020/php-chat-client – sdolgy

+0

또한 PHP는 한 요청보다 오래 실행되도록 설계되지 않았습니다. 오래 걸릴 수 있습니다 (채팅 봇을 오래 전에 했었습니다).하지만 매우주의하지 않으면 메모리 누수와 충돌 위험이 높습니다. 다른 언어는 상주 앱에 더 적합 할 수 있습니다. – ToBe

답변

1

미안하지만, 가능하다면 HTTP 바인딩 모듈이있는 ejabberd 서버와 같은 XMPP 준비 솔루션을 사용하는 것이 좋습니다. 물론, 그런 단점이있다. 그러나 단점은 더 크다. 이 솔루션을 살펴보면 저비용으로 문제를 해결할 수있을 것입니다.

내가 무슨 일이 일어나고 있는지 이해 생각 related answer with brief desc on XMPP solution

1

를 참조하십시오. 청취자가 누락 된 것 같은데? 일반적으로 채팅 프로그램에는 정기적으로 특정 사용자의 메시지를 확인하거나 "청취"하는 클라이언트 측 아약스가 있습니다.

예를 들어, 누군가가 데이터베이스에 사용자 x에 대한 메시지를 남겼다면 (또는 메시지를 저장할 때마다) 매초 PHP 스크립트를 호출하는 자바 스크립트가있을 수 있습니다. 사용자 x에 대한 서버. 있을 경우 메시지 또는 메시지를 다시 에코하여 AJAX 콜백 함수를 통해 메시지를 수신 할 수 있습니다.

당신이 jQuery를 잘 알고 경우, $ 갔지 방법을 확인하십시오 http://api.jquery.com/jQuery.get/

1

내가 당신의 질문을 이해, 당신은이 메시지가 도착하자마자 클라이언트에서 서버로 메시지를 보내고 싶어 모든 클라이언트에 응답 할 것입니다 서버에 ... 나는 맞다 ???

nodejs 및 다른 javascripts 기술을 사용하는 것과 같은 채팅을합니다 ... 여기 웹 소켓을 사용하는 훌륭한 옵션이 있어야합니다. 실현 그 browser support is limited,하지만 당신은 어떤 브라우저가 이것을 실행하는 데 필요한 지정되지 않았으므로 나는 좋은 방법이라고 생각합니다.

확인이 관련 링크 :

How to Use Sockets in JavaScript\HTML?

http://socket.io/

서버에 요청을하는 setInterval을 만 PHP를 사용 + JS 일부 기능을하고 넣어 일을 가능한 방법으로 모든 12 초. 나는이 접근법을 사용하는 2005 년에 일종의 ASP 채팅을했다. 그리고 나는 웹 소켓이 훨씬 낫다는 것을 말해야 만합니다.

질문에 대한 답변이 필요한 경우 알려주세요 ... 알려주세요.

+1

웹 소켓 지원은 현재의 모든 데스크탑 브라우저에서 실제로 보편적이며 IE5.5 이후 모든 브라우저에서 작동하도록 node.js에는 충분한 대체 기능이 있습니다. –

1

PHP와 jQuery를 사용하기 전에이 라인을 따라 뭔가를 만들었습니다. 내가 찾던 해결책은 서버 설정에 대한 제한 때문이었습니다. PHP 코어 스크립트를 사용하여 메시지 창에서 메시지 제출 상자까지 전체 페이지 레이아웃을 만들었습니다. 페이지에 온 모든 사용자에게는 채팅 페이지에 입장 할 때부터 유닉스 타임 스탬프에서 생성 된 user123234234와 같이 임의로 생성 된 사용자가 지정되었습니다.

제출 된 모든 메시지는 XML 파일에 저장되었으며 새로운 XMl 파일이 매일 생성되었습니다. 사용자는 다른 노드 속성을 사용하는 모든 메시지에 대해 사용자의 세부 정보와 함께 아래의 메시지 노드에 보관되었습니다.

메시지 창은 사용자가 채팅 페이지에 입장했을 때 XML 파일을 XML로 읽는 다른 PHP 스크립트로 jquery AJAX 호출을 사용하여 매 5 초마다 새로 고쳐졌습니다.

<messages> 
    <message user="user123456" ip="127.0.0.1" session="{users session ID here}" time="{unix timestamp}"><![CDATA[User message here]]></message> 
</messages> 

이 뒤에 더 많은 논리는하지만 개발하고 유지하기 위해 그것을 가장 쉬운 방법을 발견, 나는 그것이 올바른 방향으로 점을 당신을 도울 수 있기를 바랍니다. 그리고 그것은 모든 주요 브라우저와 IE7 +에서 작동합니다.