2016-08-02 14 views
1

GitHub上にこのWifiDirectDemoを少し変更して実行しています。私が直面している問題は、ソケット接続を作成中です。私はそうだと思う..私は別の電話に転送するために、1つの電話で画像を選択しているとき、私のアプリはこの例外で他の電話で閉じている:Android Wifi Direct

java.net.SocketException sendto失敗したECONNRESET(ピアによって接続がリセットされました)。

私は両方の電話機をwifi経由で直接接続しています。ここで

は、私はエラーを取得していますするコードです:

これはFileTransferServiceを呼び出すことです:サーバソケットを開くために

String localIP = Utils.getLocalIPAddress(); 
    // Trick to find the ip in the file /proc/net/arp 
    String client_mac_fixed = new  String(this.device.deviceAddress).replace("99", "19"); 
    String clientIP = Utils.getIPFromMac(client_mac_fixed); 


    Uri uri = data.getData(); 
    TextView statusText = (TextView) mContentView.findViewById(R.id.status_text); 
    statusText.setText("Sending: " + uri); 
    Log.d(WifiDirectActivity.TAG, "Intent----------- " + uri); 
    Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 
    serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uri.toString()); 

    if(localIP.equals(IP_SERVER)){ 
     serviceIntent.putExtra(FileTransferService.EXTRAS_ADDRESS, clientIP); 
    }else{ 
     serviceIntent.putExtra(FileTransferService.EXTRAS_ADDRESS, IP_SERVER); 
    } 

    serviceIntent.putExtra(FileTransferService.EXTRAS_PORT, PORT); 
    getActivity().startService(serviceIntent); 

バックグラウンドタスク:最後に

protected String doInBackground(Void... params) { 
     try { 
      ServerSocket serverSocket = new ServerSocket(PORT); 
      Log.d(WifiDirectActivity.TAG, "Server: Socket opened"); 
      Socket client = serverSocket.accept(); 
      Log.d(WifiDirectActivity.TAG, "Server: connection done"); 
      final File f = new File("amankush.txt"); 

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

      Log.d(WifiDirectActivity.TAG, "server: copying files " + f.toString()); 
      InputStream str = client.getInputStream(); 
      copyFile(str, new FileOutputStream(f)); 
      //DataInputStream inputstream =new DataInputStream(client.getInputStream()); 
      //String str = inputstream.readUTF(); 
      serverSocket.close(); 
      server_running = false; 
      return f.getAbsolutePath(); 
     } catch (IOException e) { 
      Log.e(WifiDirectActivity.TAG, e.getMessage()); 
      return null; 
     } 
    } 


    @Override 
    protected void onPostExecute(String result) { 
     if (result != null) { 
      statusText.setText("File copied - " + result); 
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_VIEW); 
      context.startActivity(intent); 
     } 

    } 

    @Override 
    protected void onPreExecute() { 
     statusText.setText("Opening a server socket"); 
    } 

filetransferservice :

public class FileTransferService extends IntentService 
{ 
private static final int SOCKET_TIMEOUT = 5000; 
public static final String ACTION_SEND_FILE = "com.example.android.wifidirect.SEND_FILE"; 
public static final String EXTRAS_FILE_PATH = "file_url"; 
public static final String EXTRAS_ADDRESS = "go_host"; 
public static final String EXTRAS_PORT = "go_port"; 

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

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); 
     Socket socket = new Socket(); 
     int port = intent.getExtras().getInt(EXTRAS_PORT); 

     try { 
      Log.d(WifiDirectActivity.TAG, "Opening client socket - "); 
      socket.bind(null); 
      socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT); 
      if(socket.isBound() && socket.isConnected() && socket.isClosed()) 
       Log.d(WifiDirectActivity.TAG, "Socket not bound"); 
      Log.d(WifiDirectActivity.TAG, "Client socket - " + socket.isConnected()); 
      OutputStream os = socket.getOutputStream(); 
      ContentResolver cr = context.getContentResolver(); 
      InputStream stream = null; 
      try { 
       stream = cr.openInputStream(Uri.parse(fileUri)); 
       //stream = new DataOutputStream(socket.getOutputStream()); 
       //stream.writeUTF("a string"); 
      } catch (FileNotFoundException e) { 
       Log.d(WifiDirectActivity.TAG, e.toString()); 
      } 
      DeviceDetailFragment.copyFile(stream, os); 
      Log.d(WifiDirectActivity.TAG, "Client: Data written"); 
     } catch (IOException e) { 
      Log.e(WifiDirectActivity.TAG, e.getMessage()); 
     } finally { 
      if (socket != null) { 
       if (socket.isConnected()) { 
        try { 
         socket.close(); 
        } catch (IOException e) { 
         // Give up 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 

これはなぜ起こっているのですか?

答えて

0

私はこれで同じ問題...

見ていた:Utilsクラスに

String localIP = Utils.getLocalIPAddress(); 

Go]を、それは常にnullを返します。戻り値を変更します。

ご希望の場合はこちらをご覧ください。

関連する問題