2013-10-20 70 views
3

我希望發送消息到基於XMPP的聊天服務器使用PHP。 我正在使用JAXL,它似乎是純PHP服務器聊天的最佳(有限)選項。基於JAXL的聊天客戶端。需要幫助連接到Gtalk或其他服務器來測試

不過,我還沒有建立任何連接,更不用說發送消息。 我有一個很難制定出如果問題是我的代碼,我的服務器(這是共享服務器,但交友,和非常有益的主機),或我的設置。

我使用的嘗試連接到GTalk的是代碼;

$client = new JAXL(array(
    'jid' => '[email protected]', 
    'pass' => 'password', 
    'host'=> 'talk.google.com', 
    'port'=> 5222, 
    'domain'=> 'gmail.com', //unsure if this is the right setting. 
    'force_tls' => true, 
    'auth_type' => @$argv[3] ? $argv[3] : 'PLAIN', 
    )); 


// 
// required XEP's 
// 
$client->require_xep(array(
'0199' // XMPP Ping 
)); 

// 
// add necessary event callbacks here 
// 

$client->add_cb('on_auth_success', function() { 
global $client; 
_info("got on_auth_success cb, jid ".$client->full_jid->to_string()); 

// fetch roster list 
$client->get_roster(); 

// fetch vcard 
$client->get_vcard(); 

// set status 
$client->set_status("available!", "dnd", 10); 
}); 
$client->add_cb('on_connect_error', function() { 
echo 'Connect Error'; 
}); 
$client->add_cb('on_auth_failure', function() { 
echo 'Auth Error'; 
}); 
$client->add_cb('on_auth_success', function() { 
global $client; 
echo 'connected'; 
$client->send_chat_msg('[email protected]', 'webtest'); 
$client->shutdown(); 
}); 

// 
// finally start configured xmpp stream 
// 

$client->start(array(
'--with-debug-shell' => true, 
'--with-unix-sock' => true 
)); 
echo "done\n"; 

觸發PHP(從瀏覽器),然後導致服務器卡住。 (沒有「完成」的消息,只是不斷加載,直到從瀏覽器超時)

服務器日誌顯示;

strict mode enabled, adding exception handlers. Set 'strict'=>TRUE inside JAXL config to disable this[0m 
error handler called with 8, Undefined index: priv_dir, 

然後很多;

unable to connect tcp://talk.google.com:5222 with error no: 110, error str: Connection timed out 

所以,我會感謝以下任何幫助;

  • 任何特定的起步
  • 選推薦我的代碼
  • 與每增加一個連接設置的任何問題,問題來研究這個問題。
  • 或者任何成功使用JAXL的人的一般建議。

感謝, 托馬斯·羅貝爾

+0

我需要同樣的事情從文件XMLStream.php連接,你有沒有解決呢? –

+0

否:( 無論在任何地方這個問題的幫助很少。 – darkflame

回答

0

好的問題可能是TCP端口關閉您的主機,嘗試用你的第一個託管打開它,也嘗試在本地運行代碼來看看它的做工精細。

有人報告的問題是固定的替代方法,通過這一個

/** 
* Connect to XMPP Host 
* 
* @param integer $timeout 
* @param boolean $persistent 
* @param boolean $sendinit 
*/ 
public function connect($timeout = 30, $persistent = false, $sendinit = true) { 
    $this->sent_disconnect = false; 
    $starttime = time(); 

    do { 
     $this->disconnected = false; 
     $this->sent_disconnect = false; 
     if($persistent) { 
      $conflag = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT; 
     } else { 
      $conflag = STREAM_CLIENT_CONNECT; 
     } 
     $conntype = 'tcp'; 
     if($this->use_ssl) $conntype = 'ssl'; 
     $this->log->log("Connecting to $conntype://{$this->host}:{$this->port}"); 
     try { 
      $this->socket = @stream_socket_client("$conntype://{$this->host}:{$this->port}", $errno, $errstr, $timeout, $conflag); 
     } catch (Exception $e) { 
      throw new XMPPHP_Exception($e->getMessage()); 
     } 
     if(!$this->socket) { 
      $this->log->log("Could not connect.", XMPPHP_Log::LEVEL_ERROR); 
      $this->disconnected = true; 
      # Take it easy for a few seconds 
      sleep(min($timeout, 5)); 
     } 
    } while (!$this->socket/* && (time() - $starttime) < $timeout*/); 

    if ($this->socket) { 
     stream_set_blocking($this->socket, 0); 
     if($sendinit) $this->send($this->stream_start); 
    } else { 
     throw new XMPPHP_Exception("Could not connect before timeout."); 
    } 
}