我有一个 Activity,它调用异步任务以通过预定义的 InetAddress 接受套接字连接。
Async 任务调用另一个 Async 任务来监听消息。但它挂在 get 输入流上
我已经绞尽脑汁好几个小时了,无法弄清楚它为什么会挂起……请帮忙。
public void startSocketListener(InetAddress groupOwnerAddress) {
// TODO Auto-generated method stub
AcceptClientThread accept;
try {
accept = new AcceptClientThread();
accept.execute();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class AcceptClientThread extends AsyncTask<Void, String, String>{
public AcceptClientThread() throws IOException{
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("CONNECTION ERR", "Could not close serverSocket " + e.toString());
}
super.onCancelled();
}
@Override
protected String doInBackground(Void... params) {
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
Log.e("CONNECTION ERR","Could not listen on port: " + port);
onCancelled();
}
while (listening){
try {
Log.i("CONNECTION", "AWAITING CONNECTION TO CLIENT");
Socket newSocket = serverSocket.accept();
Log.i("CONNECTION", "CONNECTED TO CLIENT");
ListenerThread lThread = new ListenerThread(newSocket);
lThread.execute("Do it");
Log.i("CONNECTION", "ACCEPTED CLIENT");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
onProgressUpdate("could not accept client");
}
}
Log.i("CONNECTION", "close socket");
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "table connected";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
// received data is first element in the String
//Toast.makeText(KitchenActivity.this, values[0], Toast.LENGTH_SHORT).show();
}
}
public class ListenerThread extends AsyncTask<String, Order, Void> {
private Socket socket;
ObjectInputStream ois;
public ListenerThread(Socket socket){
this.socket = socket;
try {
ois = new ObjectInputStream(this.socket.getInputStream()); //hangs here
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}