ServerSocket在AsyncTask中关闭[Android Wifi P2P Manager]

时间:2015-09-23 18:45:08

标签: android sockets networking android-asynctask wifip2p

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

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

什么有效: - >客户端可以首次成功将数据发送到客户端,但不能一次又一次

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

startserver()调用此异步任务,以下是其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){

    }
}

客户端代码: 当客户端点击发送按钮并调用start client方法时启动它。它在之前设置Ip值并捆绑它们并将消息发送部分调用为名为FileTransferService的Intent服务

它的代码是(抽象的):

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


    }

}

1 个答案:

答案 0 :(得分:-1)

你应该尝试https://github.com/tavendo/AutobahnAndroid并从服务中运行客户端,从asyntask它总是最终完成。