2014-10-18 50 views
0

我是一个Android开发的新手,我测试时通过http连接发送短信并得到一个返回字符串时有这个错误消息。下面是HTTP API:我想通过android的http连接

http://server:port/CreditCheck/checkcredits?username=xxxxx&password=xxxx 

我得到java.io.ioexception,我不知道如何进一步跟踪,它真的让我头疼。

public class Sender { 
    // Username that is to be used for submission 
    String username; 
    // password that is to be used along with username 
    String password; 
    // Message content that is to be transmitted 
    String message; 
    /** 
    * What type of the message that is to be sent 
    * <ul> 
    * <li>0:means plain text</li> 
    * <li>1:means flash</li> 
    * <li>2:means Unicode (Message content should be in Hex)</li> 
    * <li>6:means Unicode Flash (Message content should be in Hex)</li> 
    * </ul> 
    */ 
    String type; 
    /** 
    * Require DLR or not 
    * <ul> 
    * <li>0:means DLR is not Required</li> 
    * <li>1:means DLR is Required</li> 
    * </ul> 
    */ 
    String dlr; 
    /** 
    * Destinations to which message is to be sent For submitting more than one 
    * destination at once destinations should be comma separated Like 
    * 91999000123,91999000124 
    */ 
    String destination; 
    // Sender Id to be used for submitting the message 
    String source; 
    // To what server you need to connect to for submission 
    String server; 
    // Port that is to be used like 8080 or 8000 
    int port; 
    // urlParts is the excessive part of the URL 
    //String urlParts; 

    public Sender(String server, int port, String username, String password, 
      String message, String dlr, String type, String destination, String source) { 

     this.username = username; 
     this.password = password; 
     this.message = message; 
     this.dlr = dlr; 
     this.type = type; 
     this.destination = destination; 
     this.source = source; 
     this.server = server; 
     this.port = port; 

    } 


    public String checkBalance() { 
     try { 

      // Url that will be called to submit the message 
      URL sendUrl = new URL("http://" + this.server + ":" + this.port 
      + "/CreditCheck/checkcredits"); 
      HttpURLConnection httpConnection = (HttpURLConnection) sendUrl 
      .openConnection(); 
      // This method sets the method type to POST so that 
      // will be send as a POST request 
      httpConnection.setRequestMethod("POST"); 
      // This method is set as true wince we intend to send 
      // input to the server 
      httpConnection.setDoInput(true); 
      // This method implies that we intend to receive data from server. 
      httpConnection.setDoOutput(true); 
      // Implies do not use cached data 
      httpConnection.setUseCaches(false); 

      // Data that will be sent over the stream to the server. 
      DataOutputStream dataStreamToServer = new DataOutputStream(
      httpConnection.getOutputStream()); 
      dataStreamToServer.writeBytes("username=" 
      + URLEncoder.encode(this.username, "UTF-8") + "&password=" 
      + URLEncoder.encode(this.password, "UTF-8")); 

      dataStreamToServer.flush(); 
      dataStreamToServer.close(); 
      // Here take the output value of the server. 
      BufferedReader dataStreamFromUrl = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); 
      String dataFromUrl = "", dataBuffer = ""; 
      // Writing information from the stream to the buffer 
      while ((dataBuffer = dataStreamFromUrl.readLine()) != null) { 
       dataFromUrl += dataBuffer; 
      } 
      /** 
      * Now dataFromUrl variable contains the Response received from the 
      * server so we can parse the response and process it accordingly. 
      */ 
      dataStreamFromUrl.close(); 
      //System.out.println("Response: " + dataFromUrl); 
      return dataFromUrl; 
     } catch (IOException ex) { 

      ex.printStackTrace(); 
      return ex.toString(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
      return ex.toString(); 
     } 
    } 

    public String submitMessage() { 
     try { 
      // Url that will be called to submit the message 
      URL sendUrl = new URL("http://" + this.server + ":" + this.port + "/bulksms/bulksms"); 
      HttpURLConnection httpConnection = (HttpURLConnection) sendUrl.openConnection(); 

      // This method sets the method type to POST so that 
      // will be send as a POST request 
      httpConnection.setRequestMethod("GET"); 
      // This method is set as true wince we intend to send 
      // input to the server 
      httpConnection.setDoInput(true); 
      // This method implies that we intend to receive data from server. 
      httpConnection.setDoOutput(true); 
      // Implies do not use cached data 
      httpConnection.setUseCaches(false); 

      // Data that will be sent over the stream to the server. 
      DataOutputStream dataStreamToServer = new DataOutputStream(httpConnection.getOutputStream()); 
      dataStreamToServer.writeBytes("username=" 
      + URLEncoder.encode(this.username, "UTF-8") + "&password=" 
      + URLEncoder.encode(this.password, "UTF-8") + "&type=" 
      + URLEncoder.encode(this.type, "UTF-8") + "&dlr=" 
      + URLEncoder.encode(this.dlr, "UTF-8") + "&destination=" 
      + URLEncoder.encode(this.destination, "UTF-8") + "&source=" 
      + URLEncoder.encode(this.source, "UTF-8") + "&message=" 
      + URLEncoder.encode(this.message, "UTF-8")); 

      dataStreamToServer.flush(); 
      dataStreamToServer.close(); 

      // Here take the output value of the server. 
      BufferedReader dataStreamFromUrl = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); 
      String dataFromUrl = ""; 
      String dataBuffer = ""; 

      // Writing information from the stream to the buffer 
      while ((dataBuffer = dataStreamFromUrl.readLine()) != null) { 
       dataFromUrl += dataBuffer; 
      } 
      /** 
      * Now dataFromUrl variable contains the Response received from the 
      * server so we can parse the response and process it accordingly. 
      */ 
      dataStreamFromUrl.close(); 
      //System.out.println("Response: " + dataFromUrl); 
      return dataFromUrl; 

     } catch (IOException ex) { 
      //ex.printStackTrace(); 
      return ex.toString(); 
     }catch(Exception ex){ 
      return ex.toString(); 
     } 
    } 

下面是我的按钮onClicklistener

public void onClick(View v) { 
     Sender s = new Sender("server", port, "username", "password", "test for unicode", "1", "0", "23481111111", "Update"); 
     switch(v.getId()){ 
      case R.id.btnSaveSettings: 
       Toast.makeText(getActivity(), s.submitMessage().toString(), Toast.LENGTH_SHORT).show(); 
       break; 
      case R.id.btnBalance: 
       Toast.makeText(getActivity(), s.checkBalance().toString(), Toast.LENGTH_SHORT).show(); 

       break; 
      default: 
       Toast.makeText(getActivity(), "No button Captured", Toast.LENGTH_SHORT).show(); 

     } 
} 

请帮我什么我做错了调用脚本!

@Angad我编辑了代码,下面是它看起来像和我得到的错误。

我的调用方法

public String checkBalance() { 
    try { 
     HttpClient client=new DefaultHttpClient(); 

     HttpPost request=new HttpPost("http://" + this.server + ":" + this.port + "/CreditCheck/checkcredits"); 

     BasicNameValuePair username=new BasicNameValuePair("username", this.username); 
     BasicNameValuePair password=new BasicNameValuePair("password", this.password); 

     List<NameValuePair> list=new ArrayList<NameValuePair>(); 
     list.add(username); 
     list.add(password); 

     UrlEncodedFormEntity urlentity=new UrlEncodedFormEntity(list); 
     request.setEntity(urlentity); 

     HttpResponse response=client.execute(request); 

     HttpEntity entity=response.getEntity(); 
     String tmp=EntityUtils.toString(entity); 
     return tmp; 

    }catch(Exception ex){ 
     ex.printStackTrace(); 
     return ex.toString(); 
    } 
} 

我的onclick实施操作方法checkBalance()

public void onClick(View v) { 
    Sender s = new Sender("111.211.211.111", 8080, "user", 
      "pass", "test for unicode", "1", "0", "234811111111", "Update"); 
    // TODO Auto-generated method stub 
    switch(v.getId()){ 
     case R.id.btnSaveSettings: 
      //this.savePreferences(); 
      Toast.makeText(getActivity(), s.submitMessage().toString(), Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.btnBalance: 

      Toast.makeText(getActivity(), s.checkBalance().toString(), Toast.LENGTH_SHORT).show(); 

      break; 
     default: 
      Toast.makeText(getActivity(), "No button Captured", Toast.LENGTH_SHORT).show(); 

    } 

我的清单文件

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.myapp" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="19" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 


</manifest> 

异常错误 Android.os.NetworkOnMainThreadException

错误消息的logcat包括堆栈跟踪()

10-19 14:22:20.285:E /的Soundpool(1273):错误装载/系统/ media/audio/ui/Effect_Tick.ogg 10-19 14:22:20.285:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/Effect_Tick.ogg 10-19 14: 22:20.285:E/SoundPool(1273):加载错误/system/media/audio/ui/Effect_Tick.ogg 10-19 14:22:20.285:W/AudioService(1273):Soundpool无法加载文件:/ s ystem /media/audio/ui/Effect_Tick.ogg 10-19 14:22:E/SoundPool(1273):error/20.285:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/Effect_Tick.ogg 10-19 14:22:20.285:E/SoundPool(1273):error loading/system/media /audio/ui/Effect_Tick.ogg 10-19 14:22:20.285:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/Effect_Tick.ogg 10-19 14:22 :20.295:E/SoundPool(1273):错误加载/system/media/audio/ui/Effect_Tick.ogg 10-19 14:22:20.295:W/AudioService(1273):Soundpool无法加载文件:/ system/media/audio/ui/Effect_Tick.ogg 10-19 14:22:20.305:E/SoundPool(1273):error loading /system/media/audio/ui/KeypressStandard.ogg 10-19 14:22:20.305:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/KeypressStandard.ogg 10-19 14:22:20.305:E/SoundPool(1273 ):error /system/media/audio/ui/KeypressSpacebar.ogg 10-19 14:22:20.315:W/AudioService(1273):Soundpool无法加载文件:/ system/media/audio/ui/KeypressSpacebar。 ogg 10-19 14:22:20.315:E/SoundPool(1273):error loading /system/media/audio/ui/KeypressDelete.ogg 10-19 14:22:20。315:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/KeypressDelete.ogg 10-19 14:22:20.325:W/System.err(1854):android.os。 NetworkOnMainThreadException 10-19 14:22:20.325:E/SoundPool(1273):错误加载/system/media/audio/ui/KeypressReturn.ogg 10-19 14:22:20.325:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/KeypressReturn.ogg 10-19 14:22:20.325:E/SoundPool(1273):error loading /system/media/audio/ui/KeypressInvalid.ogg 10 -19 14:22:20.325:W/AudioService(1273):Soundpool无法加载文件:/system/media/audio/ui/KeypressInvalid.ogg 10-19 14:22:20.335:W/AudioService(1273): onLoadSoundEffects(),错误-1而装载样品 10-19 14:22:20.335:W/System.err的(1854):在android.os.StrictMode $ AndroidBlockG uardPolicy.onNetwork(StrictMode.java:1145) 10-19 14:22:20.335:W/System.err(1854):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 10-19 14: 22:20.335:W/System.err(1854):在libcore.io.IoBridge.connectErrno(IoBridge.java:127) 10-19 14:22:20.335:W/System.err(1854):位于libcore。 io.IoBridge.connect(IoBridge.java:112) 10-19 14:22:20.345:W/System.err(1854):at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 10-19 14:22:20.345:W/System.err(1854):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 10-19 14:22:20.345:W/System.err(1854):at java.net.Socket.connect(Socket.java:843) 10-19 14:22:20.345:W/System.err的(1854):在org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory。 java:119) 10-19 14:22:20.345:W/System.err(1854):at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 10-19 14:22:20.355: W/System.err(1854):at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 10-19 14:22:20.355:W/System.err(1854):at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 10-19 14:22:20.355:W/System.err(1854):at org.apache.http.impl.client。 DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 10-19 14:22:20.355:W/System.err(1854):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 10-19 14:22:20.365:W/System.err的(1854):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 10-19 14:22:20.365:W/System.err的(1854):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 10-19 14:22:20.375: W/System.err(1854):at com.example.sleeksmsmobile.Sender.checkBalance(Sender.java:96) 10-19 14:22:20.375:W/System.err(1854):at com.example。 sleeksmsmobile.SettingsTab.onClick(SettingsTab.java:86) 10-19 14:22:20.375:W/System.err(1854):at android.view.View.performClick(View.java:4438) 10-19 14:22:20.385:W/System.err的(1854):在android.view.View $ PerformClick.run(View.java:18422) 10-19 14:22:20.385:W/System.err的(1854) :at android.os.Handler.handleCallback(Handler.java:733) 10-19 14:22:20.385:W/System.err(1854):at android.os.Handler.dispatchMessage(Handler.java:95) 10-19 14:22:20.385:W/System.err(1854): at android.os.Looper.loop(Looper.java:136) 10-19 14:22:20.395:W/System.err(1854):at android.app.ActivityThread.main(ActivityThread.java:5017) 10-19 14:22:20.395:W/System.err(1854):at java.lang.reflect.Method.invokeNative(Native Method) 10-19 14:22:20.395:W/System.err(1854) :在java.lang.reflect.Method.invoke(Method.java:515) 10-19 14:22:20.405:W/System.err的(1854):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller。运行(ZygoteInit.java:779) 10-19 14:22:20.405:W/System.err(1854):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 10-19 14:22:20.415:W/System.err(1854):at dalvik.system.NativeStart.main(Native Method) 10-19 14:22:20.925:I/Choreographer(1273):跳过36帧!应用程序可能在其主线程上做了太多工作。

+2

可以为您提供从ex.printStackTrace完整的错误消息()? – 2014-10-18 11:38:23

+1

ioexception在哪一行?也告诉我的行声明...' – 2014-10-18 11:43:29

+0

@angad tiwari ioexception在onclick操作期间,在Toast.maketext操作中调用submitmessage和校验 Toast.makeText(getActivity(),s.checkBalance()。toString() ,Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(),s.submitMessage()。toString(),Toast.LENGTH_SHORT).show(); – 2014-10-18 13:57:50

回答

-1

而使用的HttpConnection我建议你使用的HttpClient 喜欢这个

  try 
      { 
       HttpClient client=new DefaultHttpClient(); 
       HttpPost request=new HttpPost("your url"); 

       BasicNameValuePair email=new BasicNameValuePair("username", "your username"); 
       BasicNameValuePair password=new BasicNameValuePair("password", "your password"); 

       List<NameValuePair> list=new ArrayList<NameValuePair>(); 
       list.add(username); 
       list.add(password); 

       UrlEncodedFormEntity urlentity=new UrlEncodedFormEntity(list); 
       request.setEntity(urlentity); 

       HttpResponse response=client.execute(request); 

       HttpEntity entity=response.getEntity(); 
       String tmp=EntityUtils.toString(entity); 
       return tmp; 
      } 
      catch(Exception e) 
      { 
       return e.toString(); 
      } 

尝试yourcode ......并告诉我...我会surelly工作...和它也相当简单。 ..它的所有与流和所有的网格..希望这将有助于... ;-)

+0

我已经实现了代码,请在我的问题中阅读上面的代码和错误消息,其中包括printStackTrace()。请帮助我! – 2014-10-19 18:35:23

+0

除this.u之外还可以首先检查浏览器上的响应。使用ADVANCE REST CLIENT chrome扩展...因此,所有人都知道..问题出在哪里。 – 2014-10-19 20:12:01

+0

问题已修复,请通读我的答案。 我很高兴与家伙:) – 2014-10-19 20:34:30

0

在Android中,您必须在用户界面的单独线程上运行网络操作。否则,发送HTTP请求的行为将导致接口冻结。

Android documentation

+0

我的设备不冻结,一切似乎工作正常,但错误消息只是在执行submitMessage和checkBalance时出现。 谢谢 – 2014-10-18 14:01:44

0

你的代码中有注释和实际的编码之间的矛盾:

 // This method sets the method type to POST so that 
     // will be send as a POST request 
     httpConnection.setRequestMethod("GET"); 

,然后继续与双方setDoInput和setDoOutput设置为true:

 // This method is set as true wince we intend to send 
     // input to the server 
     httpConnection.setDoInput(true); 
     // This method implies that we intend to receive data from server. 
     httpConnection.setDoOutput(true); 

的setDoOutput (true)将请求方法隐式设置为POST,因为无论何时您想发送请求主体,都是默认方法。 (见HttpURLConnection sends a POST request even though httpCon.setRequestMethod("GET"); is set)。这可能会导致错误。

如需进一步的研究,请指明错误的位置(源代码行)。

+0

非常感谢我在故障排除过程中必须更改请求方法,我将更改回POST但错误仍然存​​在。 错误的位置是这样的 Toast.makeText(getActivity(),** s.submitMessage()**。toString(),Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(),** s.checkBalance()**。toString(),Toast.LENGTH_SHORT).show(); – 2014-10-18 14:08:39

0

我很高兴地通知每一个谁关心我的问题,它已被修复。

我的代码工作正常,Angad Tiwari的作品更简单。

后,我能得到我的AVD互联网的话,我可以使用的printStackTrace()错误报告找到原因这是严格的模式策略

修复是我把下面这段代码在MainActivity类;

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

我很欣赏你所有..... :)