Android的WebSocket的服务使多个连接 [英] Android WebSocket Services making multiple connections

查看:402
本文介绍了Android的WebSocket的服务使多个连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个Web Socket服务。但它保持做多的连接

我只想应用程序,使一个连接,除非网络连接断开,然后再拍。 但现在,它使一个连接,如果我preSS手机上的主页按钮。并返回上的应用程序,它会使另一个连接。

感谢您的帮助球员。

的onCreate ... 我MainActivity的

 意图startServiceIntent =新的意图(这一点,WebSocketServices.class);
        startService(startServiceIntent);
 

清单

 <! -  WebSocket的 - >
<接收器
    机器人:名称=com.example.basicplayerapp.core.NetworkReceiver>
   <意向滤光器>
       <作用机器人:名称=android.net.conn.CONNECTIVITY_CHANGE/>
       <作用机器人:名称=android.intent.action.BOOT_COMPLETED/>
   &所述; /意图滤光器>
< /接收器>
<服务机器人:名称=com.example.basicplayerapp.core.WebSocketServices>< /服务>
 

NetworkReceiver

 公共类NetworkReceiver扩展的BroadcastReceiver {
    公共静态最终字符串变量= HomeActivity.class.getSimpleName();

    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){
        ConnectivityManager康恩=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        的NetworkInfo的NetworkInfo = conn.getActiveNetworkInfo();

        如果(的NetworkInfo = NULL和放大器;!&安培; networkInfo.getDetailedState()== NetworkInfo.DetailedState.CONNECTED){
            Log.i(TAG,连接);

            意图startServiceIntent =新的意图(背景下,WebSocketServices.class);
            context.startService(startServiceIntent);

        }
        否则,如果(的NetworkInfo!= NULL){
            NetworkInfo.DetailedState状态= networkInfo.getDetailedState();
            Log.i(TAG,state.name());
        }
        其他 {
            Log.i(TAG,失去联系);

        }


    } //结束的onReceive
}; //结束NetworkReceiver
 

WebsocketServices

 公共类WebSocketServices扩展IntentService {
    公共静态最终字符串变量= WebSocketServices.class.getSimpleName();

    私有静态字符串SOCKET_ADDR =htt​​p://171.0.0.1:8080;
    私人字符串消息= NULL;
    私人的WebSocket插座= NULL;

    公共WebSocketServices(){
        超级(下载服务);
    }


    @覆盖
    保护无效onHandleIntent(意向意图){
        Log.i(TAG,onHandleIntent);

        // SOCKET_ADDR = intent.getStringExtra(IP);

        如果(插座== NULL ||!socket.isOpen()|| socket.isPaused())
        connectToPASocket(SOCKET_ADDR);

        Log.d(TAG,服务调用函数);
    } //结束onHandleIntent






    // ================================================ =====================================
    //套接字连接
    // ================================================ =====================================
    私人无效connectToPASocket(字符串SOCKET_ADDR){
        Log.i(TAG,connectToPASocket());

        // 检查
        如果(插座=空&放大器;!&安培; socket.isOpen())回报;


        //初始化网络套接字连接
        AsyncHttpClient.getDefaultInstance()的WebSocket(SOCKET_ADDR,空,
                新AsyncHttpClient.WebSocketConnectCallback(){
                    @覆盖
                    公共无效onCompleted(异常前,的WebSocket的WebSocket){
                        Log.i(TAG,onCompleted);

                        如果(恩!= NULL){
                            Log.i(TAG,onCompleted>如果(前= NULL)!);
                            ex.printStackTrace();
                            返回;
                        }

                        插座= WebSocket的;
                        socket.setStringCallback(新StringCallback(){
                            公共无效onStringAvailable(String s)将{
                                Log.i(TAG,socket.setStringCallback> onStringAvailable  -  S =>中+ S);

                                的System.out.println(我有一个字符串:+ S);
                                消息= S;



                            } //结束onStringAvailable
                        }); //结束socket.setStringCallback

                        socket.setDataCallback(新DataCallback(){//找出这样做
                            @覆盖
                            公共无效onDataAvailable(DataEmitter发射器,ByteBufferList BB){
                                Log.i(TAG,socket.setDataCallback> onDataAvailable |发射器=>中+发射器+| BB =>中+ BB);

                                的System.out.println(我得到了一些字节!);
                                //注意,此数据被读
                                bb.recycle();
                            }
                        }); //结束webSocket.setDataCallback

                    } //结束onCompleted
                }); //结束AsyncHttpClient.getDefaultInstance()
    } //结束connectToPASocket
} //结束WebSocketServices
 

解决方案

捷运,我也有过类似万阿英,蒋达清。

不要使用intentService。只需使用服务。因为一旦intentService已经完成,它将结束自己。

在切换到服务,你可以做的,就是用布尔检查,如果您的服务已启动,如下所示:

 布尔isSockeStarted = FALSE;



  @覆盖
  公众诠释onStartCommand(意向意图,诠释标志,诠释startId){
...


        如果(插座== NULL ||!socket.isOpen()|| socket.isPaused()){

            如果(isSockeStarted){//未启动
            } 其他 {
                isSockeStarted = TRUE;
            }
        }
....
 

这意味着,这项服务将只启动一次。直到您手动杀死它。

它为我工作,试图让我知道。

I have created a Web Socket Service. but it keeping making multiple connection

I just want the app to make one connection, unless the network connection drops then make another. But right now, it makes one connection, if I press the home button on the phone. and go back on the app, it will make another connection.

Thanks for your help guys .

onCreate... of my MainActivity

Intent startServiceIntent = new Intent(this, WebSocketServices.class);
        startService(startServiceIntent);

Manifest

<!-- WebSocket -->
<receiver 
    android:name="com.example.basicplayerapp.core.NetworkReceiver">
   <intent-filter >
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
       <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter> 
</receiver>
<service android:name="com.example.basicplayerapp.core.WebSocketServices"></service>

NetworkReceiver

public class NetworkReceiver extends BroadcastReceiver {
    public static final String TAG = HomeActivity.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {         
        ConnectivityManager conn =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = conn.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
            Log.i(TAG, "connected");

            Intent startServiceIntent = new Intent(context, WebSocketServices.class);
            context.startService(startServiceIntent);

        } 
        else if(networkInfo != null){
            NetworkInfo.DetailedState state = networkInfo.getDetailedState();
            Log.i(TAG, state.name());
        }
        else {
            Log.i(TAG, "lost connection");

        }


    }//end onReceive    
};//end NetworkReceiver

WebsocketServices

public class WebSocketServices extends IntentService {
    public static final String TAG = WebSocketServices.class.getSimpleName();

    private static  String SOCKET_ADDR = "http://171.0.0.1:8080";
    private String message = null;
    private WebSocket socket = null;

    public WebSocketServices() {
        super("DownloadService");
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        Log.i(TAG, "onHandleIntent");

        //SOCKET_ADDR = intent.getStringExtra("ip");

        if(socket==null || !socket.isOpen() || socket.isPaused())
        connectToPASocket(SOCKET_ADDR);

        Log.d(TAG,"Service Invoke Function");
    }//end onHandleIntent






    //=====================================================================================
    // Socket connection 
    //===================================================================================== 
    private void connectToPASocket(String SOCKET_ADDR) {
        Log.i(TAG, "connectToPASocket()");

        // Checking
        if (socket != null && socket.isOpen()) return;


        // Initiate web socket connection
        AsyncHttpClient.getDefaultInstance().websocket(SOCKET_ADDR, null,
                new AsyncHttpClient.WebSocketConnectCallback() {
                    @Override
                    public void onCompleted(Exception ex, WebSocket webSocket) {
                        Log.i(TAG, "onCompleted");

                        if (ex != null) {
                            Log.i(TAG, "onCompleted > if (ex != null)");
                            ex.printStackTrace();
                            return;
                        }

                        socket = webSocket;
                        socket.setStringCallback(new StringCallback() {
                            public void onStringAvailable(String s) {
                                Log.i(TAG, "socket.setStringCallback > onStringAvailable - s => " + s);

                                System.out.println("I got a string: " + s);
                                message = s;



                            }// end onStringAvailable
                        });// end socket.setStringCallback

                        socket.setDataCallback(new DataCallback() { // Find out what this does
                            @Override
                            public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
                                Log.i(TAG, "socket.setDataCallback > onDataAvailable | emitter=> " + emitter + " | bb => " + bb);

                                System.out.println("I got some bytes!");
                                // note that this data has been read
                                bb.recycle();
                            }
                        });// end webSocket.setDataCallback

                    }// end onCompleted
                });// end AsyncHttpClient.getDefaultInstance()
    }// end connectToPASocket
}//end WebSocketServices

解决方案

MrT, I had a similar probelm.

Dont use intentService. Just use Service. Because once the intentService has been done, it will finish itself.

After you change to Service, What you can do, is to use boolean to check if your service has been started like so:

boolean isSockeStarted = false;



  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
...


        if (socket == null || !socket.isOpen() || socket.isPaused()) {

            if (isSockeStarted) { //not started
            } else {
                isSockeStarted = true;
            }
        }
....

That mean, this service will only start once. until you kill it manually.

it worked for me, try and let me know.

这篇关于Android的WebSocket的服务使多个连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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