PHP socket with android

I would like to ask how to create a PHP socket that can receive a request from an Android phone in real time? At the moment, I have done this part of the code and was able to test it with telnet. However, when the android phone tries to connect, it cannot receive or send anything to the server.

if (!defined('SOCKET_ADDRESS')) { define('SOCKET_ADDRESS', '192.168.1.4'); } if (!defined('SOCKET_PORT')) { define('SOCKET_PORT', '5888'); } if (!defined('MAX_CLIENTS')) { define('MAX_CLIENTS', '10'); } set_time_limit(0); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); socket_bind($socket, SOCKET_ADDRESS, SOCKET_PORT) or die('Could not bind to address ' . SOCKET_ADDRESS . ' on port ' . SOCKET_PORT . "!\n"); socket_listen($socket, MAX_CLIENTS) or die("Could not setup socket listener!\n"); // setup read socket array $read = array(); // client array w/ default initial socket $clients = array('0' => array('socket' => $socket)); // force debug at first run.. $debug = true; $time = time(); printf('Time: %d%s', $time, "\n"); $status = true; while ($status) { if (time() - $time >= 10) { $time = time(); printf('Time: %d%s', $time, "\n"); $debug = true; } if ($debug === true) { printf('Debug: %s%s', $debug, "\n"); } // $read[0] = $socket; if ($debug) { var_dump($read); } // Handle clients for ($i = 0; $i < count($clients); $i++) { if (isset($clients[$i]['socket'])) { if ($debug === true) { printf('Setting socket %d to client %d%s', $i, $i, "\n"); } $read[$i] = $clients[$i]['socket']; } } if ($debug) { var_dump($read); } // Any changed sockets? // $write and $except are only placeholders $changed_sockets = socket_select($read, $write = NULL, $except = NULL, 0); if ($debug === true) { printf('Changed sockets: %d%s', $changed_sockets, "\n"); } // Handle new connections if (in_array($socket, $read)) { for ($i = 0; $i < MAX_CLIENTS; $i++) { if (!isset($clients[$i])) { $clients[$i]['socket'] = socket_accept($socket); socket_getpeername($clients[$i]['socket'], $ip); $clients[$i]['ip'] = $ip; printf('Accepting connection into client %d from %s%s', $i, $ip, "\n"); break; } // } elseif($i == MAX_CLIENTS - 1) { // echo 'Too many clients connected!', "\n"; // } if ($changed_sockets < 1) { continue; } } } if ($debug) { var_dump($clients); } for ($i = 0; $i < count($clients); $i++) { $client = $clients[$i]; // Has our client socket seen any changes? if (in_array($client['socket'], $read)) { printf('Client %d has changed! Reading...%s', $i, "\n"); $data = socket_read($client['socket'], 1024); if ($data === false) { $error = socket_strerror(socket_last_error()); printf('An error occured...%s%s', $error, "\n"); } printf("Read raw data %s from client %i%s", $data, $i, "\n"); if ($data === null) { // disconnected unset($clients[$i]); } $data = trim($data); if ($data == 'Q') { printf('Received exit command from client%s', "\n"); socket_close($clients[$i]['socket']); $status = false; } elseif ($data) { // Strip whitespace printf('Received data: %s from client %d%s', $data, $i, "\n"); $output = sprintf('%s%s%s', $data, "\n", chr(0)); socket_write($client['socket'], $output); } } } // reset debug $debug = false; } socket_close($socket); 
+5
source share
2 answers

Add this library to build.gradle.

  compile "org.java-websocket:Java-WebSocket:1.3.0" 

to connect:

  private void connectWebSocket() { URI uri; try { uri = new URI("ws://websockethost:8080"); } catch (URISyntaxException e) { e.printStackTrace(); return; } mWebSocketClient = new WebSocketClient(uri) { @Override public void onOpen(ServerHandshake serverHandshake) { Log.i("Websocket", "Opened"); mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL); } @Override public void onMessage(String s) { final String message = s; runOnUiThread(new Runnable() { @Override public void run() { TextView textView = (TextView)findViewById(R.id.messages); textView.setText(textView.getText() + "\n" + message); } }); } @Override public void onClose(int i, String s, boolean b) { Log.i("Websocket", "Closed " + s); } @Override public void onError(Exception e) { Log.i("Websocket", "Error " + e.getMessage()); } }; mWebSocketClient.connect(); } 

send a message:

 public void sendMessage(String message) { mWebSocketClient.send(message); } 

ref: https://github.com/elabs/mobile-websocket-example

+2
source

If you want to skip what Ive wrote, it will load on a fully working PHP socket server and Android socket client (with all source code): http://developersfound.com/PHP_SocketServer_Android_SocketClient.zip

Or for information you may find useful for reading ....

An important rule here is to understand the differences between the HTTP request / response model and the TCP model. The advantage of TCP over HTTP is that you can send messages to the queue and use full-duplex (two-way simultaneous communication), as well as open TCP connections a little more responsive. If your solution does not need the sequence and benefits of full duplex, you should actually use RPC over HTTP or REST. HTTP is much easier to implement and more reliable on mobile devices. Moving long distances on mobile devices tends to break TCP connections, and when the connection is interrupted, you lose priority and need to reconnect. Reconnecting also requires much more battery power and can hang the client system. Another disadvantage is that a live system can end up with many live connections and significantly slow down your servers; more than a busy HTTP server.

However, if your solution needs or benefits from the benefits of TCP, read on ....

This code base (in the link above) has a fully functional (stand-alone) PHP server and a fully functional Android socket client. This code base should serve as a reliable reference for implementing client sockets in Android. This code base is implemented in accordance with the best practices of Android, and also serves as a strong reference for implementing a long-term stability process.

It should be noted that in Android docs, it is recommended to use Services to implement sockets, since sockets cannot be parsed. For this reason, a singleton model is needed. You will notice that this code base uses AIDL to communicate with the service and broadcasts to update the user interface. This is best practice because sockets must be protected from garbage collection and rest, which usually interrupts socket connections. Services associated with AIDL and stream performers are associated with best practices for the stability of long-term processes.

Hope this helps.

+1
source

Source: https://habr.com/ru/post/1215721/


All Articles