2013-04-12 17 views
8

您好,我的最终目的是在两台设备之间使用wifi直接API传输文件。一旦设备充当客户端,另一个设备就像wifi直接sdk演示中的服务器一样。为此,使用服务器端口和主机地址从客户端创建套接字。我想传输多个文件。在接收端,在接受客户端套接字连接时,我必须创建具有从客户端发送的文件的文件名的文件。但我不知道服务器端的文件名。如何查找在android中通过wifi直接模式传输的文件的文件名?

那么如何使用套接字连接发送文件名为这个wifi直接传输模式进行多文件传输。

使用服务器端口和主机地址创建从客户端套接字:

fileUris = intent.getExtras().getParcelableArrayList(EXTRA_STREAM); 
     String host = intent.getExtras().getString(
       EXTRAS_GROUP_OWNER_ADDRESS); 
     Socket socket = new Socket(); 
     int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT); 

     try { 
      Log.d(WifiDirectActivity.TAG, "Opening client socket - "); 
      socket.bind(null); 
      socket.connect((new InetSocketAddress(host, port)), 
        SOCKET_TIMEOUT); 

      Log.d(WifiDirectActivity.TAG, 
        "Client socket - " + socket.isConnected()); 
      OutputStream stream = socket.getOutputStream(); 
      ContentResolver cr = context.getContentResolver(); 
      InputStream is = null; 
      for (int i = 0; i < fileUris.size(); i++) { 
       Uri uri = fileUris.get(0); 

       try { 
        is = cr.openInputStream(Uri.parse(uri.toString())); 
       } catch (FileNotFoundException e) { 
        Log.d(WifiDirectActivity.TAG, e.toString()); 
       } 
       DeviceDetailFragment.copyFile(is, stream); 
       Log.d(WifiDirectActivity.TAG, "Client: Data written"); 
      } 

接受客户端套接字连接形式的服务器端:

ServerSocket serverSocket = new ServerSocket(8988); 
      Log.d(WifiDirectActivity.TAG, "Server: Socket opened"); 
      Socket client = serverSocket.accept(); 

      Log.d(WifiDirectActivity.TAG, 
        "Server: connection done with client"); 

      final File f = new File(
        Environment.getExternalStorageDirectory() + "/" 
          + context.getPackageName() + "/wifip2pshared-" 
          + "sample"); 
      File dirs = new File(f.getParent()); 
      if (!dirs.exists()) 
       dirs.mkdirs(); 
      f.createNewFile(); 

      Log.d(WifiDirectActivity.TAG, 
        "server: copying files " + f.toString()); 
      InputStream inputstream = client.getInputStream();       

      copyFile(inputstream, new FileOutputStream(f)); 
      serverSocket.close(); 

真的击中在给出文件名接收方在创建文件时。有什么方法可以发送文件名称。 请帮助我。提前致谢。

+0

如果我这样做的方式确实符合您的需求,请将其标记为已接受的答案,以便它可能成为其他人的参考。谢谢。 – Sebastiano

回答

2

您可以创建一个包含文件名和实际数据的包对象。事情是这样的:

public class WiFiDirectBundle extends Serializable { 
     private String fileName; 
     private String mimeType; 
     private Long fileSize; 
     private byte[] fileContent; 

     public WiFiDirectBundle() {} 

     // adds a file to the bundle, given its URI 
     public void setFile(Uri uri) { 
      File f = new File(Uri.parse(uri.toString())); 

      fileName = f.getName(); 
      mimeType = MimeTypeMap.getFileExtensionFromUrl(f.getAbsolutePath()); 
      fileSize = f.length(); 

      FileInputStream fin = new FileInputStream(f);   
      fileContent = new byte[(int) f.length()]; 
      fin.read(fileContent); 
     } 

     // restores the file of the bundle, given its directory (change to whatever 
     // fits you better) 
     public String restoreFile(String baseDir) { 
      File f = new File(baseDir + "/" + fileName); 
      try { 
       FileOutputStream fos = new FileOutputStream(f); 
       if (fileContent != null) { 
        fos.write(fileContent); 
       } 

       fos.close(); 
       return f.getAbsolutePath(); 

      } catch (IOException e) { 
        e.printStackTrace(); 
      } 

      return null; 
     } 

     public String getFileName() { 
      return fileName; 
     } 

     public String getMimeType() { 
      return mimeType; 
     } 

     public Long getFileSize() { 
      return fileSize; 
     } 
    } 

然后,您可以简单地使用输入和输出流传递WiFiDirectBundle来回的一个实例。当你收到一个对象时,你必须明确地将它转换为WiFiDirectBundle类。

我知道这不是优雅,但它确实有效。