2012-11-28 31 views
0

从此代码我可以传输文件与我的电脑在Android 2.3.3。(戴尔Streak),但当我运行相同的代码在Android 4.2(三星GS 3)没有。我认为问题是Socket何时初始化?我必须做的是在4.2中工作吗?Android套接字运行在姜饼,但不是在果冻豆

package com.hrandika.synchronizer.serverClient; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 

import android.os.AsyncTask; 
import android.util.Log; 

public class Client { 

File sendingFile; 

public Client(File sendingFile) { 
    Log.d("Client", "Cleint : Constructed"); 
    this.sendingFile = sendingFile; 
} 

public void send(String ip) { 
    try { 
     Log.d("Client", "Cleint stating ...."); 
     Socket socket = new Socket(ip, 5555); 
     Log.d("Client", "Cleint Socket Okay"); 

     OutputStream outputStream = socket.getOutputStream(); 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
       outputStream); 

     Log.d("Client", "Cleint ready to sent"); 
     outputStreamWriter.write(sendingFile.getName() + "\n"); 
     outputStreamWriter.flush(); 
     Log.d("Client", "Cleint Sent"); 

     InputStream inputStream = socket.getInputStream(); 
     InputStreamReader inputStreamReader = new InputStreamReader(
       inputStream); 

     BufferedReader bufferedReader = new BufferedReader(
       inputStreamReader); 

     String serverResponse = bufferedReader.readLine(); 

     if (serverResponse.equals("READY")) { 
      Log.d("Client", "Cleint : server ready"); 

      byte[] buffer = new byte[(int) sendingFile.length()]; 
      FileInputStream fileInputStream = new FileInputStream(
        sendingFile); 
      BufferedInputStream bufferedInputStream = new BufferedInputStream(
        fileInputStream); 
      bufferedInputStream.read(buffer, 0, buffer.length); 
      outputStream.write(buffer, 0, buffer.length); 

      outputStream.flush(); 
      bufferedInputStream.close(); 
      fileInputStream.close(); 
      socket.close(); 

     } 

    } catch (Exception e) { 
    } 
} 



public class Sender extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... params) { 
     send("192.168.43.21"); 
     return null; 
    } 

} 
} // End class Client 
+0

use e.printStackTrace();在catch下看看这段代码是否给出了错误? –

+0

你如何实例化并启动'Sender'?盲猜:你自己调用'doInBackground()'(这是'AsyncTask'误用),从而导致'NetworkOnMainThreadException'? –

+0

它显示此11-28 17:17:52.890:W/System.err(20565):android.os.NetworkOnMainThreadException – learnwhat

回答

0

您不能在UI线程上执行任何网络连接,并且这是由以Honeycomb开头的平台实施的。我想你没有正确使用AsyncTask

强制性阅读:

更新:作为网络的错误,开始adb shell(我假设设备通过USB连接到PC)和类型telnet 192.168.43.21 5555 - 通过这种方式,您将能够检查您的服务器是否可以从手机实际到达。

更新2:刚刚检查,恐怕telnet二进制文件不存在于股票(不是固定的)设备上。但是任何可连接到给定IP /端口的应用程序都足以用于测试,例如,这telnet client。这样,您甚至可以在触摸自己的代码之前就消除安装问题。

+0

我的坏我创建了Asyn任务我已经修复,但我现在在Android 4.2(在2.3中完美工作)得到这个错误java.net.ConnectException:未能连接到/192.168.43.21(端口5555):连接失败: ENETUNREACH(网络无法访问) – learnwhat

+0

那么,你确定192.168.43.21可以在你的设备直接连接的网络上使用吗?听起来像一个设置问题。 –

+0

它在android 2.3中完美工作,但在4.2中没有4.2是否有特殊的事情要做?所以我确定192.168.43.21可用 – learnwhat