Php和Android都是現代技術中使用非常廣泛的技術,在開發當中,兩者的結合可以達到非常好的效果。其中,聊天是一個非常重要的功能,為了實現這個功能,我們可以使用PHP和Android的結合來完成。
首先,我們來看看PHP的相關處理。在實現聊天功能中,PHP主要是用來處理聊天消息的傳遞,為了方便,我們可以使用類似websocket這樣的技術來實現消息傳遞。下面是一個簡單的PHP的websocket服務器示例:
class ChatServer { private $clients = array(); public function __construct($host, $port){ echo "Server Started\n"; $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); socket_listen($socket, 20) or die("Could not set up socket listener\n"); $this->clients[] = array('socket'=>$socket); while (true) { $this->checkSockets(); } } function checkSockets(){ $read = array(); $write = array(); $except = array(); foreach ($this->clients as $k=>$client) { $read[$k] = $client['socket']; } socket_select($read, $write, $except, null); foreach ($read as $socket) { if ($socket == $this->clients[0]['socket']) { $newSocket = socket_accept($socket); $this->clients[] = array('socket'=>$newSocket); $this->writeInSocket($newSocket, "enter login name:"); } elseif($socket != $this->clients[0]['socket']) { $index = $this->findClientBySocket($socket); $buffer = ''; $bytes = @socket_recv($socket, $buffer, 10240, 0); if ($bytes === false) { $this->removeClient($index); continue; } } } }上述代碼中,定義了一個ChatServer類,用來處理聊天信息的傳遞。在類中定義了一個clients數組,表示當前已連接到服務器的客戶端;在構造函數中創建socket,并將socket加入clients數組中。checkSockets方法會循環監測當前客戶端是否有數據可讀,如果有的話則統一處理。 接下來,我們來看看在Android中如何使用PHP的websocket實現聊天功能。首先,需要在Android中建立一個socket連接,連接到PHP服務器,代碼如下:
try { InetAddress serverAddr = InetAddress.getByName(SERVER_IP); socket = new Socket(serverAddr, SERVER_PORT); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); }上述代碼中,建立了一個socket連接,并連接到對應的IP地址和端口。 接下來,我們需要開啟一個線程,用來不斷地監聽服務器返回的消息。代碼如下:
Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { try { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = in.readLine(); if (str != null) { Message message = new Message(); message.what = MSG_RECEIVED; message.obj = str; handler.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } } } }); thread.start();上述代碼中,線程會不停地監聽服務器返回的消息,并通過handler傳遞給UI線程進行處理。 最后,我們來實現一下聊天界面。這里簡單實現了一個聊天框和發送按鈕,代碼如下:
private void initViews() { btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String message = editContent.getText().toString(); new Thread(new Runnable() { @Override public void run() { try { PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); out.println(message); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }); }上述代碼中,通過初始化視圖來監聽發送按鈕,當點擊發送按鈕時,會將當前文本框的內容發送到服務器端。 綜上,通過PHP的websocket和Android的socket配合,我們完成了一個簡單的聊天功能。當然,在實際開發中,還需要考慮更多的細節問題,比如消息傳遞的安全性、穩定性等等。但是,本示例可以給大家一個基本的思路和一個參考實現。