我需要向PHP服务器发送一个文件和一些数据。我正在使用一个线程和一个每15分钟执行一次的服务。当网络可用时工作正常。但是当它不在网络中时它停止发送文件(如果文件的大小相对较大)。在应用日志时,我得看到,服务器的respnse没有被提取。它被sck.Moreover它在第一次尝试发送文件时发送Unknownhost异常那可能是什么问题?请帮帮忙。
以下是代码: -
public void run(){
while (keepRunning){
isRunning = true;
SystemClock.sleep(900000);
File tempFile = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "barcode_log");
File tempFile1 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "data_log.txt");
if(tempFile.exists())
{
Log.d(TAG," in keep running");
String[] files = (new File(Environment.getExternalStorageDirectory() + PATH)).list();
Log.d(TAG," below file list");
SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMdd_HHmmss");
Date curDate = new Date();
String s= "data_log";//df3.format(curDate);
Log.d("log",files[0]);
File file = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/","barcode_log");
String new_file_name =s+".txt";
// File (or directory) with new name
File file2 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/",new_file_name);
// Rename file (or directory)
if(!tempFile1.exists()){
boolean success = file.renameTo(file2);
Log.d(TAG," file name created");
if (success) {
// File was not successfully renamed
Log.d(TAG," file rename success");
}
else
{
Log.d(TAG," file not rename success");
}
}
ts.writeBarcodeToFile(" S L", "");
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
String pathToOurFile = Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/"+new_file_name;//zipName;
String urlServer = "http://xyz.com/xyz.php?fname="+s+".txt";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "V2ymHFg03ehbqgZCaKO6jy";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 2*1024*1024;
FileInputStream fileInputStream=null;
try
{
ts.writeBarcodeToFile(" in try sl", "");
fileInputStream = new FileInputStream(new File(pathToOurFile) );
InetAddress iAddr = InetAddress.getByName("http://xyz.com");
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
connection.setConnectTimeout(20000);
outputStream = new DataOutputStream( connection.getOutputStream() );
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
ts.writeBarcodeToFile("before while sl ", "");
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
ts.writeBarcodeToFile("after while sl ", "");
// Responses from the server (code and message)
try{
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
if(serverResponseCode==200)
{
ts.writeBarcodeToFile("in if server response ", "");
//ts.writeBarcodeToFile("L S", "");
tempFile1.delete();
}
else
{
ts.writeBarcodeToFile("in else server response ", "");
ts.writeBarcodeToFile(serverResponseCode+"", "");
}
}
catch(Exception e)
{
try{
outputStream.flush();
outputStream.close();
}
catch(Exception ex)
{
}
ts.writeBarcodeToFile("in url catch response "+e.toString(), "");
connection.disconnect();
}
ts.writeBarcodeToFile("after server sl ", "");
fileInputStream.close();
outputStream.flush();
outputStream.close();
ts.writeBarcodeToFile("after close sl ", "");
}
catch (java.net.SocketTimeoutException e) {
try{
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch(Exception ex)
{
}
ts.writeBarcodeToFile("in socketex sl "+e.toString(), "");
connection.disconnect();
}
catch (java.io.IOException e)
{
try{
fileInputStream.close();
outputStream.flush();
outputStream.close();
connection.disconnect();
}
catch(Exception ex)
{
}
ts.writeBarcodeToFile("in ioex sl "+e.toString(), "");
}
catch (Exception ex)
{
try{
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch(Exception exy)
{
}
ts.writeBarcodeToFile("in catch sl "+ex.toString(), "");
connection.disconnect();
//Exception handling
}
//System.gc();
}
}
isRunning = false;
}
答案 0 :(得分:3)
此问题与连接有关。我也看到当我们在wifi上时,我们没有遇到未知的主机异常错误(除非我拔掉设备)。 当设备仅使用3g / 4g时,我们遇到了未知的主机异常错误。
您可以尝试使用resumable支持上传类似的帖子resume uploads using HTTP?
或编写自己的协议(块上传)。
答案 1 :(得分:1)
您需要使用AsyncTask进行Android版本3.x及更高版本的网络操作。您不能在主线程中使用网络操作....如果文件大小很大,您可能必须在服务上使用wake_lock。 ..如果网络不可用而不是简单地关闭你的AsyncTask而不是在15分钟后再次检查你在服务中说...使用此代码检查AsyncTask中的网络可用性
public boolean isOnline() {
if(MyService.CONTEXT !=null){
ConnectivityManager cm = (ConnectivityManager) MyService.CONTEXT.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
}
return false
}
答案 2 :(得分:1)
Android更高版本必须要快得多。最好在bacground方法中使用AsynTask
。
protected class GetTask extends AsyncTask<Void, Void, Integer> {
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(MainActivity.this,
"Loading", "Please wait");
}
@Override
protected Integer doInBackground(Void... params) {
// TODO Auto-generated method stub
/// Do your stuf
return 0;
}
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
}
}
我遇到了同样的问题。现在在后台工作正常使用