2013-01-15 66 views
0

我正在开发我的第一个android应用。截至目前,我的笔记本电脑上运行着一台小型服务器,并从eclipse安卓工具箱(4.0.3)的示例中获取了“Skeleton App”示例。我试图抛出一个基本的Socket连接,最终发送字符串。用完就扔的IO premission该应用程序被拒绝的异常,但一旦我添加了一行:Android应用因网络意外关闭

<uses-permission android:name="android.permission.INTERNET"/>

应用只是意外关闭。如果该行不在,应用程序不会关闭,但我当然会得到该异常。

这里是我的代码:

SERVER:

public class net { 
    public static void main(String [] args){ 
      ServerSocket ss; 
      try { 
        ss = new ServerSocket(10017); 
        System.out.println("waiting"); 
        Socket newSock = ss.accept(); 
        System.out.println("success!"); 
      } catch (IOException e) { 
        System.out.println("FAIL"); 
        e.printStackTrace(); 
      } 
    } 

}

客户端(我加入,并呼吁buildNet()方法):

public class SkeletonActivity extends Activity { 

static final private int BACK_ID = Menu.FIRST; 
static final private int CLEAR_ID = Menu.FIRST + 1; 
static private int port = 10013; 
static private String address; 
static Socket sock; 

private EditText mEditor; 

public SkeletonActivity() { 
} 

/** Called with the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Inflate our UI from its XML layout description. 
    setContentView(R.layout.skeleton_activity); 

    // Find the text editor view inside the layout, because we 
    // want to do various programmatic things with it. 
    mEditor = (EditText) findViewById(R.id.editor); 

    // Hook up button presses to the appropriate event handler. 
    ((Button) findViewById(R.id.back)).setOnClickListener(mBackListener); 
    ((Button) findViewById(R.id.clear)).setOnClickListener(mClearListener); 


    // 
    //THIS IS WHERE BUILD NET IS CALLED. ITS RESULT IS RETURNED AND PRINTED TO THE 
    //SCREEN OF THE APP 
    // 
    mEditor.setText(buildNet()); 
} 

/** 
* Called when the activity is about to start interacting with the user. 
*/ 
@Override 
protected void onResume() { 
    super.onResume(); 
} 

public String buildNet(){ 
    FileWriter fstream= null; 
    BufferedWriter out = null; 

    try { 
     address = "192.168.1.122"; 
     sock = new Socket(address, port); 
     return "YES"; 
    } catch (UnknownHostException e) { 
     return "UNKNOWN HOST"; 
    } catch (IOException e) { 
     return e.getMessage(); 
    } 
} 

/** 
* Called when your activity's options menu needs to be created. 
*/ 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 

    // We are going to create two menus. Note that we assign them 
    // unique integer IDs, labels from our string resources, and 
    // given them shortcuts. 
    menu.add(0, BACK_ID, 0, R.string.back).setShortcut('0', 'b'); 
    menu.add(0, CLEAR_ID, 0, R.string.clear).setShortcut('1', 'c'); 

    return true; 
} 

/** 
* Called right before your activity's option menu is displayed. 
*/ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 

    // Before showing the menu, we need to decide whether the clear 
    // item is enabled depending on whether there is text to clear. 
    menu.findItem(CLEAR_ID).setVisible(mEditor.getText().length() > 0); 

    return true; 
} 

/** 
* Called when a menu item is selected. 
*/ 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case BACK_ID: 
     finish(); 
     return true; 
    case CLEAR_ID: 
     mEditor.setText(""); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

/** 
* A call-back for when the user presses the back button. 
*/ 
OnClickListener mBackListener = new OnClickListener() { 
    public void onClick(View v) { 
     finish(); 
    } 
}; 

/** 
* A call-back for when the user presses the clear button. 
*/ 
OnClickListener mClearListener = new OnClickListener() { 
    public void onClick(View v) { 
     mEditor.setText(""); 
    } 
}; 

}

MA NIFEST.XML:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Copyright (C) 2007 The Android Open Source Project 

    Licensed under the Apache License, Version 2.0 (the "License"); 
    you may not use this file except in compliance with the License. 
    You may obtain a copy of the License at 

      http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 

<!-- This file describes the code in the SkeletonApp package, which is 
    used by the system to determine how to start your application and 
    integrate it with the rest of the system. --> 

<!-- Declare the contents of this Android application. The namespace 
    attribute brings in the Android platform namespace, and the package 
    supplies a unique name for the application. When writing your 
    own application, the package name must be changed from "com.example.*" 
    to come from a domain that you own or have control over. --> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.skeletonapp"> 

<uses-permission android:name="android.permission.INTERNET"/> 

<uses-sdk android:targetSdkVersion="11"/> 
<!-- This package contains an application... The 'label' is the name 
    to display to the user for the overall application, and provides 
    a default label for all following components. The syntax here is a 
    reference to one of our string resources.--> 
<application android:label="@string/skeleton_app"> 

    <!-- An Activity in the application - this is something the user 
     can launch and interact with. The "name" attribute is the 
     name of the class within your package that implements this 
     activity. --> 
    <activity android:name="SkeletonActivity"> 

     <!-- An IntentFilter tells the system when it should use your 
      activity. This allows the user to get to your activity 
      without someone having to explicitly know to launch your 
      class "com.examplel.android.skeletonapp.SkeletonActivity". --> 
     <intent-filter> 
      <!-- The MAIN action describes a main entry point into an 
       activity, without any associated data. --> 
      <action android:name="android.intent.action.MAIN" /> 

      <!-- This places this activity into the main app list. --> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

    </activity> 

</application> </manifest> 
+0

尝试在应用程序标记内部放置权限 – nayab

+0

请问Logcat在哪里? – t0mm13b

回答

1

您很有可能得到NetworkOnMainThreadException。您应该将您的电话buildNet()拨打AsyncTaskonPostExecute,返回结果(您的情况为String),并将其设置为TextView

Here's the docs/guide使用AsyncTask

+0

完美,谢谢。 – kekkles4