Wifi直接服务器/客户端连接

时间:2017-05-24 18:12:10

标签: android networking wifi-direct

我正在按照Google Developer's guide的指南撰写WiFi Direct Android应用程序。我刚开始学习。我被困在从客户端发送图像到服务器。以下是从Demo中获取的客户端和服务器编码:

这是调用Client Intent(MainActivity)的代码:

@Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode ==SELECT_IMAGE) {
        Log.d(MainActivity.TAG, "onActivityResult Start");
        Log.d(MainActivity.TAG, "requestCode "+requestCode);


        Uri uri = data.getData();

        Intent serviceIntent = new Intent(this, FileTransferService.class);
        serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE);
        serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uri.toString());
        Log.d(MainActivity.TAG, "file path " + uri.toString());
        serviceIntent.putExtra(FileTransferService.EXTRAS_ADDRESS, IP_SERVER);
        serviceIntent.putExtra(FileTransferService.EXTRAS_PORT, PORT);
        this.startService(serviceIntent);
    } else {
        Log.d(MainActivity.TAG, "Service transfer failed");
    }
}

这是Client的代码(我在一个单独的类中使用了IntentService):

    public class FileTransferService extends IntentService {
        public static final int SOCKET_TIMEOUT = 5000;
        public static final String ACTION_SEND_FILE = "com.moon.android.wifidirectproject_moon.action.SEND_FILE";
        public static final String EXTRAS_ADDRESS = "go_host";
        public static final String EXTRAS_FILE_PATH = "file_url";
        public static final String EXTRAS_PORT = "go_port";
        Socket socket = new Socket();


        public FileTransferService() {
            super("FileTransferService");
        }

        @Override
        protected void onHandleIntent(Intent intent) {
            Context context = getApplicationContext();

            if (intent.getAction().equals(ACTION_SEND_FILE)) {
                String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);
                String host = intent.getExtras().getString(EXTRAS_ADDRESS);
                int port = intent.getExtras().getInt(EXTRAS_PORT);

                try {
                    Log.d(MainActivity.TAG, "Opening client socket - ");
                    Log.d(MainActivity.TAG, "fileUri" + fileUri);
                    Log.d(MainActivity.TAG, "host" + host);

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

                    Log.d(MainActivity.TAG, "Client socket - " + socket.isConnected());
                    OutputStream stream = socket.getOutputStream();
                    ContentResolver cr = context.getContentResolver();
                    InputStream is = null;
                    try {
                        is = cr.openInputStream(Uri.parse(fileUri));
                        Log.d(MainActivity.TAG, "is - " + is);

                    } catch (FileNotFoundException e) {
                        Log.d(MainActivity.TAG, e.toString());
                    }
                    copyFile(is, stream);
                    Log.d(MainActivity.TAG, "Client: Data written");
                } catch (IOException e) {
                    Log.e(MainActivity.TAG, e.getMessage());
                } finally {
                    if (socket != null) {
                        if (socket.isConnected()) {
                            try {
                                socket.close();
                            } catch (IOException e) {
                                // Give up
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }

        public static boolean copyFile(InputStream inputStream, OutputStream out) {
            byte buf[] = new byte[1024];
            int len;
            try {
                while ((len = inputStream.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
                out.close();
                inputStream.close();
            } catch (IOException e) {
                Log.d(MainActivity.TAG, e.toString());
                return false;
            }
            return true;
        }
    }

这是对Server Intent的调用

                   @Override
                    public void onConnectionInfoAvailable(WifiP2pInfo info) {



                        if (info.groupFormed && info.isGroupOwner) {

                            InetAddress groupOwnerAddress = info.groupOwnerAddress;
                            ownerIP = groupOwnerAddress.getHostAddress();
                            Log.d(MainActivity.TAG, "Owner connected" + ownerIP);
                            Intent serverIntent = new Intent(mActivity, ServerService.class);
                            serverIntent.putExtra("port",MainActivity.PORT);
                            mActivity.startService(serverIntent);
.....

以下是服务器意图服务:

public class ServerService extends IntentService {
    public static String mClientIP;

    public ServerService() {
        super("ServerService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Context context = getApplicationContext();
        Integer port = intent.getExtras().getInt("port");

        try {

            ServerSocket serverSocket = new ServerSocket(port);
            Socket client = serverSocket.accept();

            Log.d(MainActivity.TAG, "Server: Socket opened");
            Log.d(MainActivity.TAG, "clientIP" + client.getInetAddress().toString());
            mClientIP = client.getInetAddress().toString();
            Log.d(MainActivity.TAG, "Server: connection done");

/*
            *************I am stuck here******************************
*/
            final File f = new File(Environment.getExternalStorageDirectory() + "/"
                    + context.getPackageName() + "/wifip2pshared-" + System.currentTimeMillis()
                    + ".jpg");

            File dirs = new File(f.getParent());
            if (!dirs.exists())
                dirs.mkdirs();
            f.createNewFile();

            Log.d(MainActivity.TAG, "server: copying files " + f.toString());
            InputStream inputstream = client.getInputStream();
            copyFile(inputstream, new FileOutputStream(f));
            serverSocket.close();
        } catch (IOException e) {
            Log.e(MainActivity.TAG, e.getMessage());
        } finally {
            stopSelf();
        }
    }

    public static boolean copyFile(InputStream inputStream, OutputStream out) {
        byte buf[] = new byte[1024];
        int len;
        try {
            while ((len = inputStream.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            out.close();
            inputStream.close();
        } catch (IOException e) {
            Log.d(MainActivity.TAG, e.toString());
            return false;
        }
        return true;
    }
}

最后,以下是我的LogCat。我把星号标记放在服务器没有进一步进展的地方。

1) Server device (Initial State)
: search start
: WiFi_enabled
: Owner connected192.168.49.1

2) Client Device(sending image):
...............................
Opening client socket - 
: fileUricontent://media/external/images/media/16871
: host192.168.49.1
: Client socket - true
: WiFi_enabled
: is - android.os.ParcelFileDescriptor$AutoCloseInputStream@3c520d34

3) Again Server Device
: Server: Socket opened
: clientIP/192.168.49.133
: Server: connection done
: open failed: ENOENT (No such file or directory)

我必须承认我并不完全了解服务器/客户端。我只是粗略的知识。但是,如果你给我任何关于我错误的提示,我会尝试为自己学习更多。我花了几天时间研究它,但无法解决这个问题。感谢您阅读这篇文章。

0 个答案:

没有答案