Android模拟器和PC服务器套接字通信



我已经编写了一个服务器-客户端模型的android程序。我的电脑充当服务器,AVD充当客户端。我使用10.0.2.2作为服务器的地址进行连接,但服务器端什么也没收到。当客户端是一个普通的java程序时,我的服务器工作得很好。当客户端是Android模拟器时会出现问题。我已经解决这个问题很长时间了,但我仍然没有解决办法。希望有人能帮我,谢谢!我的代码:服务器:

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文件中添加了用户权限,所以问题一定是其他方面的。

查看错误内容:NetworkOnMainThreadException。这意味着你不应该在Android的主线程上进行网络操作,因为如果你的请求碰巧延迟了一段时间,设备的响应将被阻止,直到请求完成。

为了在android上使用Socket客户端,你应该看看AsyncTask、Thread或Service。我建议您使用AsyncTask,它非常简单。onCreate()方法中的代码应该放在另一个以这种方式扩展AsyncTask的类中:

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

有关更多信息,请查看AsyncTask的文档或浏览web/stackoverflow以获取完整的示例!

希望这能帮助。。。再见

最新更新