【问题标题】:ServerSocket closing itself in AsyncTask [Android Wifi P2P Manager ]ServerSocket 在 AsyncTask 中关闭自身 [Android Wifi P2P 管理器]
【发布时间】:2015-09-23 18:45:07
【问题描述】:

我正在开发一个 android wifi -chat 应用程序。

关于我的应用的一些信息: ->一台设备调用startserver()作为服务器,另一台设备调用startclient()作为客户端

什么有效: ->一个客户端可以成功的第一次发送数据给客户端,但不能一次又一次

->我需要在第一台设备上再次调用 startserver(),以便客户端可以再次发送数据。

startserver()调用这个Async任务,下面是它的DoinBackgroundMethod

protected String doInBackground(Void... params) {
    ServerSocket serverSocket = null;
    try {

        while(true) {
            serverSocket = new ServerSocket(PORT);
            Socket client = serverSocket.accept();
            StartMSG(client);
        }

    } catch (IOException e) {
        return null;
    } finally {

        try {

            chatclient.changeserverrunning(false);
            if (serverSocket == null) {

            } else {
                serverSocket.close();
            }
            return null;
        } catch (Exception e) {

        }
    }
//return null;
}

protected void StartMSG(Socket client){

    try {
        InputStream inputstream = client.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(inputstream);
        Message m = null;
        try {
            m = (Message) ois.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (m != null) {
            if (m.gettype() == 1) {
                final String my_msg = m.getMessage();//Toast msg afterwards

        }

    }catch (Exception e){

    }
}

客户端代码: 它在客户端点击发送按钮并调用启动客户端方法时启动。在该方法中它设置之前的 Ip 值并捆绑它们并将消息发送部分称为 Intent Service,称为 FileTransferService

它的代码是(抽象的):

protected void onHandleIntent(Intent intent) {

    Context context = getApplicationContext();
    if(socket==null){
        socket = new Socket();
    }



    if (intent.getAction().equals(ACTION_SEND_FILE)) {
        final String msg_type=intent.getExtras().getString(MESSAGE_TYPE);
        String host = intent.getExtras().getString(EXTRAS_ADDRESS);

        int port = intent.getExtras().getInt(EXTRAS_PORT);

            try {
                    socket.bind(null);
                    socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);



                Message m = (Message) intent.getExtras().getSerializable(MESSAGE_INTENT_STR);
                final String my_message=m.getMessage();

                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);


                oos.writeObject(m);

                oos.flush();
                oos.close();

                InputStream is = new ByteArrayInputStream(baos.toByteArray());
                OutputStream stream = socket.getOutputStream();
                ChatClient.copyFile(is, stream);

            } catch (IOException e) {

   } finally {
                if (socket != null) {
                    if (socket.isConnected()) {
                        try {
                            //socket.close();

                        } catch (Exception e) {
                            // Give up
                            e.printStackTrace();
                        }
                    }
                }
            }


    }

}

【问题讨论】:

  • 什么IOException被抓到了?
  • 当我在异步任务上运行服务器任务时,我不能吐司异常,我可以使用 handler.post 吐司,但这只会吐司静态文本,我需要将异常对象传递给它祝酒,我觉得如何做到这一点令人困惑

标签: android sockets networking android-asynctask wifip2p


【解决方案1】:

您应该尝试https://github.com/tavendo/AutobahnAndroid 并从服务运行客户端,从异步任务中它总是会结束。

【讨论】:

  • 你能说得更具体些吗?
  • @abhirulz 是的,请查看答案中的链接,mConnection 应该从服务而不是 Asyntask 启动,并且服务应该从活动启动。这是您可以将此库用于 websocket 的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多