如何在Android WiFiDirect中创建和维护持久套接字连接?

时间:2016-01-06 12:10:35

标签: java android sockets

我正在使用WiFiDirect连接两部手机并在它们之间传输图像。我能够连接设备并将1个图像从客户端传输到服务器。当我尝试传输超过1张图像时,我失败了。

我使用onConnectionInfoAvailable方法启动我的服务器和客户端线程。

@Override
public void onConnectionInfoAvailable(WifiP2pInfo info) {
    Log.i(TAG, "GO address " + info.groupOwnerAddress.getHostAddress() + " isGroupOwner " + info.isGroupOwner);
    this.info = info;
    if (info.groupFormed && info.isGroupOwner) {
        ServerRunnable serverRunnable = new ServerRunnable(imageToBeSet);
        Thread serverThread = new Thread(serverRunnable);
        serverThread.start();
    } else {
        //Start client thread and transfer image.
    }

ServerRunnable:

public class ServerRunnable implements Runnable {
    public void run() {
        try {

            ServerSocket serverSocket = new ServerSocket(PORT);
            Socket clientSocket = serverSocket.accept();

            while (connected) {
                try {

                    InputStream inputStream = clientSocket.getInputStream();
                    final byte[] result = streamToByteArray(inputStream);
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
                            clientImage.setImageBitmap(bitmap);
                        }
                    });
                } catch (Exception e) {
                    //Handle exception
                }
            }
        } catch (Exception e) {
            //Handle exception
        }
    }
}

ClientRunnable:

public class ClientRunnable implements Runnable {
    public void run() {
        try {
            Log.d("ClientActivity", "C: Connecting...");
            Thread.sleep(2000l);
            socket.bind(null);
            socket.connect(new InetSocketAddress(host, PORT), 5000);

            while (connected) {
                if(outputStream == null) {
                    try {
                        outputStream = socket.getOutputStream();
                    } catch (Exception e) {
                        // Handle exception
                    }
                }
            }
        } catch (Exception e) {
             // Handle exception
        }
    }
    public void write(byte[] bytes) {
        try {
            outputStream.write(bytes, 0, bytes.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述写入方法不起作用。当我调试时,OutputStream连接到服务器套接字我看到有关我服务器的信息(IP地址和帖子号码)。不知道为什么我的服务器没有读取写入。套接字也显示为已连接。

第一次转移工作正常。我有一个包含Previous和Next按钮的布局。按下按钮时,我想读取图像字节数组并传输它。我无法做到这一点。

如果有人知道如何创建和维护持久套接字连接,或者使用WiFiDirect从客户端向服务器传输多个图像的任何其他方式,请告诉我。我的基础是Android SDK样本中的WiFiDirectDemo。

谢谢,

阿卡什

P.S。:我还看过使用WifiP2pDnsSdService的WiFiP2PDemo。我目前正试图了解他们如何保持套接字连续聊天。

0 个答案:

没有答案