OutputStream 处的 Http Post 异常
Http Post Exception at OutputStream
我正在尝试发出 http post 请求,我的问题是我在 DataOutputStream
处遇到异常,我想我知道在哪里,但我不知道为什么。
密码是
public string sendFileToServer(string filename, string targetUrl)
{
string response = "error";
Log.Error("Image filename", filename);
Log.Info("url", targetUrl);
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
// DataInputStream inputStream = null;
string pathToOurFile = filename;
string urlServer = targetUrl;
string lineEnd = "\r\n";
string twoHyphens = "--";
string boundary = "*****";
Java.Text.DateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH:mm:ss");
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024;
try
{
FileInputStream fileInputStream = new FileInputStream(new File(
pathToOurFile));
URL url = new URL(urlServer);
connection = (HttpURLConnection)url.OpenConnection();
// Allow Inputs & Outputs
connection.DoInput = true;
connection.DoOutput = true;
connection.UseCaches = false;
connection.SetChunkedStreamingMode(1024);
// Enable POST method
connection.RequestMethod = "POST";
connection.SetRequestProperty("Connection", "Keep-Alive");
connection.SetRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
outputStream = new DataOutputStream(connection.OutputStream);
outputStream.WriteBytes(twoHyphens + boundary + lineEnd);
string connstr = null;
connstr = "Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
+ pathToOurFile + "\"" + lineEnd;
Log.Info("Connstr", connstr);
outputStream.WriteBytes(connstr);
outputStream.WriteBytes(lineEnd);
bytesAvailable = fileInputStream.Available();
bufferSize = Java.Lang.Math.Min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.Read(buffer, 0, bufferSize);
Log.Error("Image length", bytesAvailable + "");
try
{
while (bytesRead > 0)
{
try
{
outputStream.Write(buffer, 0, bufferSize);
}
catch (OutOfMemoryError e)
{
e.PrintStackTrace();
response = "outofmemoryerror";
return response;
}
bytesAvailable = fileInputStream.Available();
bufferSize = Java.Lang.Math.Min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.Read(buffer, 0, bufferSize);
}
}
catch (Java.Lang.Exception e)
{
e.PrintStackTrace();
response = "error";
return response;
}
outputStream.WriteBytes(lineEnd);
outputStream.WriteBytes(twoHyphens + boundary + twoHyphens
+ lineEnd);
// Responses from the server (code and message)
int serverResponseCode = (int)connection.ResponseCode;
string serverResponseMessage = connection.ResponseMessage;
Log.Info("Server Response Code ", "" + serverResponseCode);
Log.Info("Server Response Message", serverResponseMessage);
if (serverResponseCode == 200)
{
response = "true";
}
string CDate = null;
Date serverTime = new Date(connection.Date);
try
{
CDate = df.Format(serverTime);
}
catch (Java.Lang.Exception e)
{
e.PrintStackTrace();
Log.Error("Date Exception", e.Message + " Parse Exception");
}
Log.Info("Server Response Time", CDate + "");
filename = CDate
+ filename.Substring(filename.LastIndexOf("."),
filename.Length);
Log.Info("File Name in Server : ", filename);
fileInputStream.Close();
outputStream.Flush();
outputStream.Close();
outputStream = null;
}
catch (Java.Lang.Exception ex)
{
// Exception handling
response = "error";
Log.Error("Send file Exception", ex.Message + "");
ex.PrintStackTrace();
}
return response;
}
这是异常时打印的完整堆栈跟踪:
05-29 01:49:10.059 W/System.err(22768): android.os.NetworkOnMainThreadException
05-29 01:49:10.450 W/System.err(22768): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108)
05-29 01:49:10.450 W/System.err(22768): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
05-29 01:49:10.450 W/System.err(22768): at libcore.io.IoBridge.connectErrno(IoBridge.java:133)
05-29 01:49:10.450 W/System.err(22768): at libcore.io.IoBridge.connect(IoBridge.java:118)
05-29 01:49:10.450 W/System.err(22768): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
05-29 01:49:10.450 W/System.err(22768): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
05-29 01:49:10.450 W/System.err(22768): at java.net.Socket.connect(Socket.java:849)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
05-29 01:49:10.450 W/System.err(22768): at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
05-29 01:49:10.450 W/System.err(22768): at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
05-29 01:49:10.450 W/System.err(22768): at android.view.View.performClick(View.java:3574)
05-29 01:49:10.450 W/System.err(22768): at android.view.View$PerformClick.run(View.java:14279)
05-29 01:49:10.450 W/System.err(22768): at android.os.Handler.handleCallback(Handler.java:605)
05-29 01:49:10.450 W/System.err(22768): at android.os.Handler.dispatchMessage(Handler.java:92)
05-29 01:49:10.450 W/System.err(22768): at android.os.Looper.loop(Looper.java:137)
05-29 01:49:10.450 W/System.err(22768): at android.app.ActivityThread.main(ActivityThread.java:4441)
05-29 01:49:10.450 W/System.err(22768): at java.lang.reflect.Method.invokeNative(Native Method)
05-29 01:49:10.450 W/System.err(22768): at java.lang.reflect.Method.invoke(Method.java:511)
05-29 01:49:10.450 W/System.err(22768): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
05-29 01:49:10.460 W/System.err(22768): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
05-29 01:49:10.460 W/System.err(22768): at dalvik.system.NativeStart.main(Native Method)
我已经测试了 url 并且它没有问题,因为我在我的代码中的其他地方使用它。我的代码有什么问题?
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpConnection {
public String readUrl(String mapsApiDirectionsUrl) throws Exception {
String data = "";
String line = "";
StringBuffer sb = new StringBuffer();
URL url;
HttpURLConnection urlConnection = null;
InputStream iStream = null;
InputStreamReader iStreamReader = null;
BufferedReader br = null;
BufferedWriter writer = null;
try{
url = new URL(mapsApiDirectionsUrl);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("User-Agent", "PPT");
urlConnection.setDoOutput(true);
writer = new BufferedOutputStream(urlConnection.getOutputStream());
writer.write("POST DATA HERE");
writer.flush();
writer.close();
iStream = urlConnection.getInputStream();
iStreamReader = new InputStreamReader(iStream);
br = new BufferedReader(iStreamReader);
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
return data;
} finally {
br.close();
iStreamReader.close();
iStream.close();
urlConnection.disconnect();
}
}
}
异常?请提供更好的信息。你有一个 NetworkOnMainThreadException
但你没有用谷歌搜索它,否则你会知道解决方案是将网络代码放在 AsyncTask 或线程中。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpConnection {
public String readUrl(String Url) throws Exception {
String data = "";
String line = "";
StringBuffer sb = new StringBuffer();
URL url;
HttpURLConnection urlConnection = null;
InputStream iStream = null;
InputStreamReader iStreamReader = null;
BufferedReader br = null;
BufferedWriter writer = null;
try{
// create server connection using URL path
url = new URL(Url);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("User-Agent", "PPT");
urlConnection.setDoOutput(true);
// post data to server using POST method not GET
writer = new BufferedOutputStream(urlConnection.getOutputStream());
writer.write("POST DATA HERE");
writer.flush();
writer.close();
// this get all data that server send to you, the response data
iStream = urlConnection.getInputStream();
iStreamReader = new InputStreamReader(iStream);
br = new BufferedReader(iStreamReader);
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
return data;
} finally {
// all connections are closed
br.close();
iStreamReader.close();
iStream.close();
urlConnection.disconnect();
}
}
}
我正在尝试发出 http post 请求,我的问题是我在 DataOutputStream
处遇到异常,我想我知道在哪里,但我不知道为什么。
密码是
public string sendFileToServer(string filename, string targetUrl)
{
string response = "error";
Log.Error("Image filename", filename);
Log.Info("url", targetUrl);
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
// DataInputStream inputStream = null;
string pathToOurFile = filename;
string urlServer = targetUrl;
string lineEnd = "\r\n";
string twoHyphens = "--";
string boundary = "*****";
Java.Text.DateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH:mm:ss");
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024;
try
{
FileInputStream fileInputStream = new FileInputStream(new File(
pathToOurFile));
URL url = new URL(urlServer);
connection = (HttpURLConnection)url.OpenConnection();
// Allow Inputs & Outputs
connection.DoInput = true;
connection.DoOutput = true;
connection.UseCaches = false;
connection.SetChunkedStreamingMode(1024);
// Enable POST method
connection.RequestMethod = "POST";
connection.SetRequestProperty("Connection", "Keep-Alive");
connection.SetRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
outputStream = new DataOutputStream(connection.OutputStream);
outputStream.WriteBytes(twoHyphens + boundary + lineEnd);
string connstr = null;
connstr = "Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
+ pathToOurFile + "\"" + lineEnd;
Log.Info("Connstr", connstr);
outputStream.WriteBytes(connstr);
outputStream.WriteBytes(lineEnd);
bytesAvailable = fileInputStream.Available();
bufferSize = Java.Lang.Math.Min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.Read(buffer, 0, bufferSize);
Log.Error("Image length", bytesAvailable + "");
try
{
while (bytesRead > 0)
{
try
{
outputStream.Write(buffer, 0, bufferSize);
}
catch (OutOfMemoryError e)
{
e.PrintStackTrace();
response = "outofmemoryerror";
return response;
}
bytesAvailable = fileInputStream.Available();
bufferSize = Java.Lang.Math.Min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.Read(buffer, 0, bufferSize);
}
}
catch (Java.Lang.Exception e)
{
e.PrintStackTrace();
response = "error";
return response;
}
outputStream.WriteBytes(lineEnd);
outputStream.WriteBytes(twoHyphens + boundary + twoHyphens
+ lineEnd);
// Responses from the server (code and message)
int serverResponseCode = (int)connection.ResponseCode;
string serverResponseMessage = connection.ResponseMessage;
Log.Info("Server Response Code ", "" + serverResponseCode);
Log.Info("Server Response Message", serverResponseMessage);
if (serverResponseCode == 200)
{
response = "true";
}
string CDate = null;
Date serverTime = new Date(connection.Date);
try
{
CDate = df.Format(serverTime);
}
catch (Java.Lang.Exception e)
{
e.PrintStackTrace();
Log.Error("Date Exception", e.Message + " Parse Exception");
}
Log.Info("Server Response Time", CDate + "");
filename = CDate
+ filename.Substring(filename.LastIndexOf("."),
filename.Length);
Log.Info("File Name in Server : ", filename);
fileInputStream.Close();
outputStream.Flush();
outputStream.Close();
outputStream = null;
}
catch (Java.Lang.Exception ex)
{
// Exception handling
response = "error";
Log.Error("Send file Exception", ex.Message + "");
ex.PrintStackTrace();
}
return response;
}
这是异常时打印的完整堆栈跟踪:
05-29 01:49:10.059 W/System.err(22768): android.os.NetworkOnMainThreadException
05-29 01:49:10.450 W/System.err(22768): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108)
05-29 01:49:10.450 W/System.err(22768): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
05-29 01:49:10.450 W/System.err(22768): at libcore.io.IoBridge.connectErrno(IoBridge.java:133)
05-29 01:49:10.450 W/System.err(22768): at libcore.io.IoBridge.connect(IoBridge.java:118)
05-29 01:49:10.450 W/System.err(22768): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
05-29 01:49:10.450 W/System.err(22768): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
05-29 01:49:10.450 W/System.err(22768): at java.net.Socket.connect(Socket.java:849)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
05-29 01:49:10.450 W/System.err(22768): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
05-29 01:49:10.450 W/System.err(22768): at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
05-29 01:49:10.450 W/System.err(22768): at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
05-29 01:49:10.450 W/System.err(22768): at android.view.View.performClick(View.java:3574)
05-29 01:49:10.450 W/System.err(22768): at android.view.View$PerformClick.run(View.java:14279)
05-29 01:49:10.450 W/System.err(22768): at android.os.Handler.handleCallback(Handler.java:605)
05-29 01:49:10.450 W/System.err(22768): at android.os.Handler.dispatchMessage(Handler.java:92)
05-29 01:49:10.450 W/System.err(22768): at android.os.Looper.loop(Looper.java:137)
05-29 01:49:10.450 W/System.err(22768): at android.app.ActivityThread.main(ActivityThread.java:4441)
05-29 01:49:10.450 W/System.err(22768): at java.lang.reflect.Method.invokeNative(Native Method)
05-29 01:49:10.450 W/System.err(22768): at java.lang.reflect.Method.invoke(Method.java:511)
05-29 01:49:10.450 W/System.err(22768): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
05-29 01:49:10.460 W/System.err(22768): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
05-29 01:49:10.460 W/System.err(22768): at dalvik.system.NativeStart.main(Native Method)
我已经测试了 url 并且它没有问题,因为我在我的代码中的其他地方使用它。我的代码有什么问题?
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpConnection {
public String readUrl(String mapsApiDirectionsUrl) throws Exception {
String data = "";
String line = "";
StringBuffer sb = new StringBuffer();
URL url;
HttpURLConnection urlConnection = null;
InputStream iStream = null;
InputStreamReader iStreamReader = null;
BufferedReader br = null;
BufferedWriter writer = null;
try{
url = new URL(mapsApiDirectionsUrl);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("User-Agent", "PPT");
urlConnection.setDoOutput(true);
writer = new BufferedOutputStream(urlConnection.getOutputStream());
writer.write("POST DATA HERE");
writer.flush();
writer.close();
iStream = urlConnection.getInputStream();
iStreamReader = new InputStreamReader(iStream);
br = new BufferedReader(iStreamReader);
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
return data;
} finally {
br.close();
iStreamReader.close();
iStream.close();
urlConnection.disconnect();
}
}
}
异常?请提供更好的信息。你有一个 NetworkOnMainThreadException
但你没有用谷歌搜索它,否则你会知道解决方案是将网络代码放在 AsyncTask 或线程中。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpConnection {
public String readUrl(String Url) throws Exception {
String data = "";
String line = "";
StringBuffer sb = new StringBuffer();
URL url;
HttpURLConnection urlConnection = null;
InputStream iStream = null;
InputStreamReader iStreamReader = null;
BufferedReader br = null;
BufferedWriter writer = null;
try{
// create server connection using URL path
url = new URL(Url);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("User-Agent", "PPT");
urlConnection.setDoOutput(true);
// post data to server using POST method not GET
writer = new BufferedOutputStream(urlConnection.getOutputStream());
writer.write("POST DATA HERE");
writer.flush();
writer.close();
// this get all data that server send to you, the response data
iStream = urlConnection.getInputStream();
iStreamReader = new InputStreamReader(iStream);
br = new BufferedReader(iStreamReader);
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
return data;
} finally {
// all connections are closed
br.close();
iStreamReader.close();
iStream.close();
urlConnection.disconnect();
}
}
}