在Android中实现Websocket客户端的简单方法是什么?以下示例正确吗?

英勇

我试图使用在Android中实现WebSocket客户端的类。但是我收到以下错误:

12-07 11:22:46.286 31579-31579/com.domain.wsocketchat W/System: ClassLoader referenced unknown path: /data/app/com.domain.wsocketchat-2/lib/arm
12-07 11:22:46.392 31579-31579/com.domain.wsocketchat W/System.err: an error occurred:java.net.SocketException: socket failed: EACCES (Permission denied)

我正在使用的类如下:

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_10;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;

public class EmptyClient extends WebSocketClient {
    public EmptyClient(URI serverUri, Draft draft) {
        super(serverUri, draft);
    }

    public EmptyClient(URI serverURI) {
        super(serverURI);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        System.out.println("new connection opened");
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("closed with exit code " + code + " additional info: " + reason);
    }

    @Override
    public void onMessage(String message) {
        System.out.println("received message: " + message);
    }

    @Override
    public void onError(Exception ex) {
        System.err.println("an error occurred:" + ex);
    }
}

该类在onCreate()中调用

WebSocketClient client = null;
try {
    client = new EmptyClient(new URI("ws://192.168.1.135:9000/server.php"), new Draft_10());
} catch (URISyntaxException e) {
    e.printStackTrace();
}
client.connect();

AndroidManifest:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

SDK: minSdkVersion 16

任何人都有任何想法,可能是什么问题?看来一切都很好!先感谢您。

英勇

我已经通过使用另一个处理websocket客户端的类解决了该问题:

    import android.app.Activity;
    import android.app.Fragment;
    import android.os.Build;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.EditText;
    import android.widget.TextView;

    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.handshake.ServerHandshake;

    import java.net.URI;
    import java.net.URISyntaxException;

    public class MainActivity extends Activity {
        private WebSocketClient mWebSocketClient;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            connectWebSocket();

            if (savedInstanceState == null) {
                getFragmentManager().beginTransaction()
                        .add(R.id.container, new PlaceholderFragment())
                        .commit();
            }
        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {

            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            switch (item.getItemId()) {
                case R.id.action_settings:
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }

        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {

            public PlaceholderFragment() {
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container, false);
                return rootView;
            }
        }

        private void connectWebSocket() {
            URI uri;
            try {
                uri = new URI("ws://192.168.1.135:9000/");
            } 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(View view) {
            EditText editText = (EditText)findViewById(R.id.message);
            mWebSocketClient.send(editText.getText().toString());
            editText.setText("");
        }
    }

对于感兴趣的任何人,我都使用过用PHP编写的Websocket-ChatServer:

<?php
$r = $_SERVER['SERVER_ADDR'];
if($r=="::1") $r="localhost";

$host = $r; //'localhost'; //host
$port = '9000'; //port
$null = NULL; //null var

//Create TCP/IP sream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//reuseable port
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

//bind socket to specified host
socket_bind($socket, 0, $port);

//listen to port
socket_listen($socket);

//create & add listning socket to the list
$clients = array($socket);

//start endless loop, so that our script doesn't stop
while (true) {
    //manage multipal connections
    $changed = $clients;
    //returns the socket resources in $changed array
    socket_select($changed, $null, $null, 0, 10);

    //check for new socket
    if (in_array($socket, $changed)) {
        $socket_new = socket_accept($socket); //accpet new socket
        $clients[] = $socket_new; //add socket to client array

        $header = socket_read($socket_new, 1024); //read data sent by the socket
        perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake

        socket_getpeername($socket_new, $ip); //get ip address of connected socket
        $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected'))); //prepare json data
        send_message($response); //notify all users about new connection

        //make room for new socket
        $found_socket = array_search($socket, $changed);
        unset($changed[$found_socket]);
    }

    //loop through all connected sockets
    foreach ($changed as $changed_socket) { 

        //check for any incomming data
        while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
        {
            $received_text = unmask($buf); //unmask data
            $tst_msg = json_decode($received_text); //json decode 
            $user_name = $tst_msg->name; //sender name
            $user_message = $tst_msg->message; //message text
            $user_color = $tst_msg->color; //color

            //prepare data to be sent to client
            $response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color)));
            send_message($response_text); //send data
            break 2; //exist this loop
        }

        $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
        if ($buf === false) { // check disconnected client
            // remove client for $clients array
            $found_socket = array_search($changed_socket, $clients);
            socket_getpeername($changed_socket, $ip);
            unset($clients[$found_socket]);

            //notify all users about disconnected connection
            $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
            send_message($response);
        }
    }
}
// close the listening socket
socket_close($sock);

function send_message($msg)
{
    global $clients;
    foreach($clients as $changed_socket)
    {
        @socket_write($changed_socket,$msg,strlen($msg));
    }
    return true;
}


//Unmask incoming framed message
function unmask($text) {
    $length = ord($text[1]) & 127;
    if($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    }
    elseif($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    }
    else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i%4];
    }
    return $text;
}

//Encode message for transfer to client.
function mask($text)
{
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header.$text;
}

//handshake new client.
function perform_handshaking($receved_header,$client_conn, $host, $port)
{
    $headers = array();
    $lines = preg_split("/\r\n/", $receved_header);
    foreach($lines as $line)
    {
        $line = chop($line);
        if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
        {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //hand shaking header
    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "WebSocket-Origin: $host\r\n" .
    "WebSocket-Location: ws://$host:$port/demo/shout.php\r\n".
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_conn,$upgrade,strlen($upgrade));
}

为了启动websocket服务器,需要运行如下控制台命令:php -q myserver.php

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用消息启动默认邮件客户端的最简单方法是什么

来自分类常见问题

javax.websocket客户端简单示例

来自分类Dev

从Web Api 2中的OData客户端调用补丁的正确方法是什么

来自分类Dev

在此示例中,在tidyverse和ggplot中订购盒装图的最简单方法是什么?

来自分类Dev

加载Google Javascript客户端库和自定义Endpoint客户端库的正确方法是什么

来自分类Dev

从服务器端向客户端发送jwt令牌的正确方法是什么?

来自分类Dev

Java中的简单Websocket客户端-连接问题

来自分类Dev

服务器端在 Rails 中渲染 React 组件的简单方法是什么?

来自分类Dev

在mysql和php中实现价格计划的最简单方法是什么?

来自分类Dev

在mysql和php中实现价格计划的最简单方法是什么?

来自分类Dev

为分片群集运行mongos客户端的正确方法是什么?

来自分类Dev

为分片群集运行mongos客户端的正确方法是什么?

来自分类Dev

用于Delphi的WebSocket客户端实现

来自分类Dev

Java REST Api(在tomcat上运行)-在客户端和服务器之间实现实时同步的最简单方法

来自分类Dev

这是重用redis客户端的正确方法吗?

来自分类Dev

客户端javascript与服务器node.js通信的简单方法

来自分类Dev

将字符串从 JavaEE 后端推送到 Javascript 客户端的任何简单方法?

来自分类Dev

在以下示例中,维护类(表)之间关系的正确方法是什么?

来自分类Dev

识别客户端使用哪个客户端库的最佳方法是什么?

来自分类Dev

在R上以下类型的数据帧中,按列值汇总行(总和)的最简单方法是什么?

来自分类Dev

在客户端运行C DLL的最佳方法是什么?

来自分类Dev

推荐的分发Javascript客户端代码的方法是什么?

来自分类Dev

客户端的客户端IP是什么

来自分类Dev

从客户端对象数组中获取最新日期的优雅方法是什么?

来自分类Dev

Web API REST客户端-在网站中(自动)认证API的最佳方法是什么

来自分类Dev

在Eleventy中执行小型客户端JavaScript的最佳方法是什么?

来自分类Dev

显示客户端名称列表的好方法是什么-SQL中的访问报告

来自分类Dev

在客户端(角度js)中存储数据的最佳方法是什么?

来自分类Dev

使用Kotlin在Android中获取屏幕截图的最简单方法是什么?

Related 相关文章

  1. 1

    使用消息启动默认邮件客户端的最简单方法是什么

  2. 2

    javax.websocket客户端简单示例

  3. 3

    从Web Api 2中的OData客户端调用补丁的正确方法是什么

  4. 4

    在此示例中,在tidyverse和ggplot中订购盒装图的最简单方法是什么?

  5. 5

    加载Google Javascript客户端库和自定义Endpoint客户端库的正确方法是什么

  6. 6

    从服务器端向客户端发送jwt令牌的正确方法是什么?

  7. 7

    Java中的简单Websocket客户端-连接问题

  8. 8

    服务器端在 Rails 中渲染 React 组件的简单方法是什么?

  9. 9

    在mysql和php中实现价格计划的最简单方法是什么?

  10. 10

    在mysql和php中实现价格计划的最简单方法是什么?

  11. 11

    为分片群集运行mongos客户端的正确方法是什么?

  12. 12

    为分片群集运行mongos客户端的正确方法是什么?

  13. 13

    用于Delphi的WebSocket客户端实现

  14. 14

    Java REST Api(在tomcat上运行)-在客户端和服务器之间实现实时同步的最简单方法

  15. 15

    这是重用redis客户端的正确方法吗?

  16. 16

    客户端javascript与服务器node.js通信的简单方法

  17. 17

    将字符串从 JavaEE 后端推送到 Javascript 客户端的任何简单方法?

  18. 18

    在以下示例中,维护类(表)之间关系的正确方法是什么?

  19. 19

    识别客户端使用哪个客户端库的最佳方法是什么?

  20. 20

    在R上以下类型的数据帧中,按列值汇总行(总和)的最简单方法是什么?

  21. 21

    在客户端运行C DLL的最佳方法是什么?

  22. 22

    推荐的分发Javascript客户端代码的方法是什么?

  23. 23

    客户端的客户端IP是什么

  24. 24

    从客户端对象数组中获取最新日期的优雅方法是什么?

  25. 25

    Web API REST客户端-在网站中(自动)认证API的最佳方法是什么

  26. 26

    在Eleventy中执行小型客户端JavaScript的最佳方法是什么?

  27. 27

    显示客户端名称列表的好方法是什么-SQL中的访问报告

  28. 28

    在客户端(角度js)中存储数据的最佳方法是什么?

  29. 29

    使用Kotlin在Android中获取屏幕截图的最简单方法是什么?

热门标签

归档