【发布时间】:2014-01-22 01:00:26
【问题描述】:
我正在尝试保存通过套接字连接获得的集合。我使用AsyncTask 从具有集合的套接字读取消息。我的问题是我无法保存此消息。在OnpostExecute() 中没有显示 Log.d() 消息。如果我这样做ReceiveMsgAsyncTask().execute().get(),用户界面就会冻结。我已经阅读了许多类似的问题,但我找不到解决方案。如何保存从我的套接字收到的消息?提前谢谢..
private class ReceiveMsgAsyncTask extends AsyncTask<Object, Void, Object> {
final Collection <String> col = new ArrayList<String>();
Socket socket = null ;
ObjectInputStream in = null;
@Override
protected Object doInBackground(Object... arg0) {
// TODO Auto-generated method stub;
Object msg = null;
try {
socket = new Socket(host,50000);
in = new ObjectInputStream(socket.getInputStream());
msg = in.readObject();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
in.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return msg;
}
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
Log.d("mesg","success");
super.onPostExecute(result);
col.addAll((Collection<?extends String>)result);
}
这是服务器向客户端发送集合的方法
public void splitData(Master master,String client){
int chunk=0;
int chunckStart=0;
BufferedReader br = null;
ObjectOutputStream out = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("input"));
int numberOflines=0;
while ((sCurrentLine = br.readLine()) != null) {
numberOflines++;
}
br.close();
br = new BufferedReader(new FileReader("input"));
for (int i=1;i<=master.numberOfWorkers;i++){
out = new ObjectOutputStream(incoming.getOutputStream());
Worker Mworker = new Worker(clientsList.get(i-1));
if (i==master.numberOfWorkers){
if (numberOflines%master.numberOfWorkers!=0)
chunk = ((numberOflines/master.numberOfWorkers)*i)+numberOflines%master.numberOfWorkers;
else chunk = ((numberOflines/master.numberOfWorkers)*i);
}
else chunk = ((numberOflines/master.numberOfWorkers)*i);
int counter = chunk;
while (counter>chunckStart) {
sCurrentLine = br.readLine();
System.out.println(sCurrentLine);
//Mworker.reduce(sCurrentLine, 1);
Mworker.getCollection().add(sCurrentLine);
counter--;
}
System.out.println("----------------------------------");
chunckStart = chunckStart +(numberOflines/master.numberOfWorkers);
System.out.println(Mworker.getWorkerName()+" has the list:");
//System.out.println(Mworker.getHashReduce());
System.out.println(Mworker.getCollection());
out.writeObject(Mworker.getCollection());//send chunk to the worker/client
//out.flush();
//out.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
//Mworker.hashReduce
//}
}
【问题讨论】:
-
那么是否有服务器在 host:50000 上发送内容?如果您尝试 telnet 到此,您可以连接吗?
-
连接无效...问题是我无法保存从连接中读取的对象。(msg = in.readObject())
-
如果服务器通过原始 tcp 套接字向您发送该对象,您的代码应该可以工作。另一方面,您应该在一段时间后在 logcat 中看到某种异常。如果您这样做,请将其添加到您的问题中。
-
请发布您的服务器代码。
-
虽然它不起作用...col 是空的...不,当我使用 AsyncTask.execute() 时,我没有例外。当我使用 AsyncTask.execute().get(1, TimeUnit.MILLISECONDS); 时,我有一个 java.util.concurrent.TimeoutException
标签: java android sockets android-asynctask