2012-07-22 46 views
0

我已经写了一个服务器端客户端模型的android程序。我的电脑充当服务器,AVD充当客户端。我使用10.0.2.2作为服务器地址来连接,但服务器端没有收到任何信息。当客户端是一个普通的Java程序时,我的服务器工作正常。当客户端是Android模拟器时会发生问题。我一直在研究这个问题很长时间,但我仍然没有解决方案。希望有人能帮助我,谢谢! 我的代码: 服务器:Android模拟器和PC服务器套接字通信

import java.net.*; 
import java.io.*; 
public class Server { 

    public static void main(String[] args) throws IOException{ 

     ServerSocket server = new ServerSocket(6002); 
     while(true){ 
      Socket client = server.accept(); 
      BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream())); 
      System.out.println(in.readLine()); 
     } 
    } 
} 

客户端:

public class modules extends Activity { 
    private ListView myListView; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.modules); 
     myListView = (ListView)findViewById(R.id.listView1); 

     Intent intent = getIntent(); 
     Bundle b = intent.getExtras(); 
     String semester = b.getString("semester"); 
     String subject = b.getString("subject"); 

     try { 
      Socket socket = new Socket("10.0.2.2",6002); 
      PrintWriter out=new PrintWriter(socket.getOutputStream(),true); 
      String s1 = "SEME" + semester; 
      out.println(s1); 
      out.flush(); 
      String s2 = "SUBJ" + subject; 
      out.println(s2); 
      out.flush(); 
      socket.close(); 

     } catch(UnknowHostException e) { 
       e.printStackTrace(); 
     } catch(IOException e) { 
       e.printStackTrace(); 
     } 
    } 
} 

在logcat中有喜欢的错误:

android.os.NetworkOnMainThreadException; 

,也错误与严格模式:

07-22 14:24:24.892: E/AndroidRuntime(759): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099). 

我在清单xml文件中添加了用户权限,因此问题必须是其他内容。

+0

logcat中是否有错误?权限可能? – charlypu 2012-07-22 13:51:59

+0

*有效的Java#65:不要忽略异常。*更少执行“一刀切”的异常* *完全忽略*。毫不奇怪,你有问题试图找到原因... – davidcesarino 2012-07-22 14:05:52

+0

非常感谢你们!我在这里是新的,你的好意真的让我印象深刻! – starrapier 2012-07-22 14:13:06

回答

2

看看错误说的是什么:NetworkOnMainThreadException。这意味着你不应该在Android的主线程上进行网络操作,因为如果你的请求恰好延迟了一段时间,设备的响应将被阻塞,直到请求完成。

为了在android上使用Socket客户端,你应该看看AsyncTask,线程或服务也许。我建议你使用AsyncTask,这非常简单。你在你的onCreate有的代码()方法应该放在一个扩展的AsyncTask这样其他类:

public class YourAsyncTask extends AsyncTask<Void, Void, Void> 
{ 
    protected Void doInBackground(Void... params) 
    { 
     //your socket code here... 
    } 
} 

欲了解更多信息,请检查文档的AsyncTask或浏览网页/计算器完整例子!

希望这有助于......再见。

+0

问题已解决。十分感谢!我希望我能成为你的专家。还要感谢@charlypu的帮助! – starrapier 2012-07-23 06:10:24

+1

我不是专家,只是遭受了和你一样的错误,并解决了它:)。祝你好运!您可以将其标记为正确的答案,以便问题显示为已解决。问候。 – unbekant 2012-07-23 11:53:17

相关问题