2015-11-21 14 views
0

感谢您花时间阅读我的问题。在Android应用程序中从Java SocketServer接收字符串

我目前正在研究我的第一个Android应用程序。我试图从我的Java SocketServer发送一个字符串,该字符串在VPS上不断运行到android应用程序。当我在Eclipse中编写10行客户端时,它完美地工作。我现在的问题是如何在Android中获得响应,因为我得到的错误如“你不能在主线程中使用套接字”,但我想要编写它的方式是用一个方法将响应作为字符串返回。

也许我应该补充说我的服务器respsonds没有输入/字符串提供。我只想打开连接并从输入流读取字符串。

我的服务器代码,我送:

try { 
     OutputStream out = socket.getOutputStream(); 
     PrintWriter pw = new PrintWriter(out); 
     String toSend = ""; 
     //This is just some serialization of own Elements to a string. 
     boolean first = true; 
     for (VertretungsPlanElement ele : Main.Elemente) { 
      if (!first) { 
       toSend = toSend + "~"; 
      } 
      first = false; 
      toSend = toSend + ele.toString(); 
     } 
     //Serialization ends 
     pw.println(toSend); 
     pw.flush(); 
     pw.close(); 
     out.flush(); 
     out.close(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    try { 
     socket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

这种方法,当我试图从我的非Android客户端的响应作品,但它给了我空或“”当我试图得到它Android系统。

我的Android代码:

  try { 
       client = new Socket(hostname, port); 
       BufferedReader is = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       response = is.readLine(); 
       Vertretungsplan.Cards.add(new VertretungsplanCard("Response:", response)); 
      } catch (Exception e) {} 

我现在做了差不多研究了一天我读到一些关于“AsynchronousTasks”什么的。

如果此问题已被要求,我很抱歉。

感谢您的时间和您的帮助!

+0

“错误,如“你不能在主线程中使用套接字”。事实上,你不能。你做了什么来解决这个问题? – greenapps

+0

非常草率被问到的问题。如果你阅读过去的流结束,它会给你null,如果你发送了一个空行,它会给你“”,如果不能同时给你两个这样的东西,从你接受的答案中可以清楚的知道你我真的得到了一个异常,这与null或“无关”。*从不*忽略IOExceptions。'异步任务'或某事'同样马虎。 – EJP

+0

我试图使用新的线程().start() ; w ith一个Runnable,但它当然不起作用,因为在runnable中获得的字符串我不能做太多。对不起,如果你认为我的问题是“马虎”。我试着在下一次更好地问它。 –

回答

0

对于Android而言,线程模型意味着“主线程”是您的应用程序正常运行的内容,以及执行您编写的代码,还会执行代码以绘制屏幕。因此,如果你在主线程上进行了联网,你的应用程序将变得没有响应,所以该框架提供了一些安全措施,以便及早采取措施并阻止它。

您需要在另一个线程上进行联网。我通常不会推荐ASyncTask作为线程解决方案,但对于初学者来说,最好让你入门。

http://developer.android.com/training/multiple-threads/index.html http://developer.android.com/reference/android/os/AsyncTask.html

ExampleTask task = new ExampleTask(); 
task.execute(); 


private class ExampleTask extends AsyncTask<Void, Void, String> { 
     @Override 
     protected Long doInBackground(Void... notUsed) { 
     try { 
      client = new Socket(hostname, port); 
      BufferedReader is = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      return is.readLine(); 

     } catch (Exception e) { 
      return "failed " + e.getMessage(); 
     } 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     Vertretungsplan.Cards.add(new VertretungsplanCard("Response:", result)); 
    } 
} 
+0

谢谢。这是一些有用的信息,我想我现在可以修复我的应用程序。谢谢你的帮助。 –

+0

np,不要忘记在'finally'块中关闭'InputStream' :-) – Blundell

+0

我不会。我会尽可能将您的帖子标记为答案。我需要等待几分钟。 - 编辑:标记为答案 –

相关问题