带有Android的PHP套接字 [英] PHP Socket with android

查看:70
本文介绍了带有Android的PHP套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想问一下如何创建一个可以实时接收来自Android手机的请求的PHP套接字吗?现在,我完成了这部分代码并能够使用telnet对其进行测试.但是,当Android手机尝试连接时,它无法接收任何内容或将任何内容发送到服务器.

I would like to ask how to create a PHP socket which able receive request from android phone in real time? For now, i done this part of code and able test it using telnet. However, when the android phone try to connect, it unable receive or send anything to 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);

推荐答案

在build.gradle中添加此库.

Add this library in build.gradle.

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

连接:

 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();
}

发送消息:

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

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

这篇关于带有Android的PHP套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆