使用WiFi Direct在2台Android设备之间的2个端口上进行通信

使用WiFi Direct在2台Android设备之间的2个端口上进行通信,android,sockets,wifi-direct,wifip2p,Android,Sockets,Wifi Direct,Wifip2p,我正在创建一个应用程序,它将监视特定Android设备客户端中的移动,并向另一个Android设备服务器报告此类实例。此外,在特定条件下,客户端将拍摄照片并将图像传输到服务器 public class MessageSender extends IntentService { public static final String EXTRAS_TIMEOUT = "timeout"; public static final String EXTRAS_ADDRESS = "go

我正在创建一个应用程序,它将监视特定Android设备客户端中的移动,并向另一个Android设备服务器报告此类实例。此外,在特定条件下,客户端将拍摄照片并将图像传输到服务器

public class MessageSender extends IntentService {

    public static final String EXTRAS_TIMEOUT = "timeout";
    public static final String EXTRAS_ADDRESS = "go_host";
    public static final String EXTRAS_PORT = "go_port";
    public static final String EXTRAS_DATA = "data";

    private Handler handler;

    public MessageSender(String name) {
        super(name);
    }

    public MessageSender() {
        super("MessageTransferService");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler = new Handler();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

            String host = intent.getExtras().getString(EXTRAS_ADDRESS);
            Socket socket = new Socket();
            int port = intent.getExtras().getInt(EXTRAS_PORT);
            byte[] data = intent.getExtras().getByteArray(EXTRAS_DATA);
            int timeout = intent.getExtras().getInt(EXTRAS_TIMEOUT);
            try {
                socket.bind(null);
                socket.connect((new InetSocketAddress(host, port)), timeout);
                OutputStream stream = socket.getOutputStream();
                stream.write(data);
            } catch (final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Exception has occurred: " + e.getMessage(),
                                Toast.LENGTH_SHORT).show();
                    }
                });
            } finally {
                if (socket != null) {
                    if (socket.isConnected()) {
                        try {
                            socket.close();
                            /*handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(), "Socket Connection closed now..",
                                            Toast.LENGTH_SHORT).show();
                                }
                            });*/
                        } catch (IOException e) {
                            // Give up
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
}
我正在使用WiFi direct设置两台设备之间的连接。之后,我将使用WiFi Direct演示中介绍的插座连接。我使用端口8988发送运动传感器事件,我使用端口8987发送图像捕获

在服务器端,我使用同一异步任务的两个不同实例,通过serversocket连接到不同的端口来侦听传入消息。只要只发送运动传感器事件,一切正常。第一次图像捕获也被正确发送/接收。但是,在此之后,服务器不会收到任何其他消息。我尝试使用两个不同的异步任务类来避免使用同一个类的两个实例,但效果并不理想。我还尝试将一个作为异步任务,另一个作为意图服务,但即使这样也不起作用

这是我用来向服务器发送消息的IntentService

public class MessageSender extends IntentService {

    public static final String EXTRAS_TIMEOUT = "timeout";
    public static final String EXTRAS_ADDRESS = "go_host";
    public static final String EXTRAS_PORT = "go_port";
    public static final String EXTRAS_DATA = "data";

    private Handler handler;

    public MessageSender(String name) {
        super(name);
    }

    public MessageSender() {
        super("MessageTransferService");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler = new Handler();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

            String host = intent.getExtras().getString(EXTRAS_ADDRESS);
            Socket socket = new Socket();
            int port = intent.getExtras().getInt(EXTRAS_PORT);
            byte[] data = intent.getExtras().getByteArray(EXTRAS_DATA);
            int timeout = intent.getExtras().getInt(EXTRAS_TIMEOUT);
            try {
                socket.bind(null);
                socket.connect((new InetSocketAddress(host, port)), timeout);
                OutputStream stream = socket.getOutputStream();
                stream.write(data);
            } catch (final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Exception has occurred: " + e.getMessage(),
                                Toast.LENGTH_SHORT).show();
                    }
                });
            } finally {
                if (socket != null) {
                    if (socket.isConnected()) {
                        try {
                            socket.close();
                            /*handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(), "Socket Connection closed now..",
                                            Toast.LENGTH_SHORT).show();
                                }
                            });*/
                        } catch (IOException e) {
                            // Give up
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
}
这是服务器上的异步任务,它在两个端口8987和8988上启动侦听器以接收运动传感器事件和图像的信息

public class MessageReceiver extends AsyncTask<Void, Void, String> {

    private Context context;
    private int port;
    private Bitmap mBitmap;

    public MessageReceiver(Context context, int port) {
        this.context = context;
        this.port = port;
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            Socket client = serverSocket.accept();
            InputStream inputstream = client.getInputStream();
            String returnString = "";
            if (port == MainActivity.PORT_SENSOR_COMM) {
               // do something
            } else if (port == MainActivity.PORT_IMAGE_COMM) {
                //do something
            }
            serverSocket.close();
            return returnString;
        } catch (Exception e) {
            return "Exception Occurred:" + e.getMessage();
        }
    }

    @Override
    protected void onPostExecute(String result) {
        boolean startNewTask = true;
        if (port == MainActivity.PORT_SENSOR_COMM) {
            //do something
        } else if (port == MainActivity.PORT_IMAGE_COMM) {
            //do something
        }
        //doing this to start listening for new messages again
        new MessageReceiver(context, port).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

    @Override
    protected void onPreExecute() {

    }

}

我现在想知道Android WiFiDirect是否允许在不同端口上的两台设备之间进行并行通信。搜索了文档,但找不到太多帮助。我做错了什么?完成我想做的事情的正确方法是什么?任何帮助都将不胜感激。感谢您的关注。

是的,如果您关闭服务器套接字,异步任务结束,可以使用wifi Direct进行并行通信。那么它应该如何接收下面的消息或图像呢?我现在看到,在onPostExecute中,您启动了一个新任务。好啊但是我们在哪里可以看到客户端再次连接?这发生在侦听器上-传感器和SurfaceTexture。基本上,MessageSender服务在发生事件时会再次调用。如果在旧侦听器准备就绪之前创建了新侦听器,并且新客户端尝试连接,则可能会连接到旧服务器。旧服务器被杀死,新服务器等待。。。