我写了一个服务器 - 客户端模型的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文件中添加了用户权限,因此问题必须是其他问题。
答案 0 :(得分:2)
查看错误说明: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以获取完整示例!
希望这有助于...再见。