2012-02-16 75 views
1

我在读取/写入到构建应用程序的tcp服务器时遇到了一些麻烦。在最近的一个线程中,我被建议使用服务,但这是一个建议使用asyncTask的学校项目,所以我可能会为此付出代价。从插座读取Android的asynctask

因此类Ive得到了是我的活动课和异步,什么有趣的事情在活动,但发送这是工作,所以生病得到与异步一个字符串。

class ServerTask extends AsyncTask<Void, Void, Void>{ 

     public static String ip = "10.0.2.2"; 
     public static int port = 2002; 
     Socket socket; 
     public DataInputStream dis; 
     public DataOutputStream dos; 
     public String message; 

     @Override 
     protected Void doInBackground(Void... params) { 

      try { 
       socket = new Socket(ip, port); 
       dis = new DataInputStream(socket.getInputStream()); 
       dos = new DataOutputStream(socket.getOutputStream()); 

      } catch (Exception e) { 
       Log.i("AsyncTank", "Cannot create Socket"); 
      } 
      while(socket.isConnected()){ 
       read();      
        } 
       } 

      } 
      return null; 
     } 

     public void write(String message) { 
      try { 
       if (socket.isConnected()){ 
        dos.writeUTF(message); 
        dos.flush(); 
       } else { 
        Log.i("AsynkTask", "Socket appears to be closed"); 
       } 
      } catch (Exception e) { 
       Log.i("AsynkTask", "Writing failed"); 
      } 
     } 

     public String read() { 
      try { 
       if (socket.isConnected()) { 
        message = dis.readLine(); 
       } else { 
        Log.i("AsyncTask", "Cannot read"); 
       } 
      } catch (Exception e) { 
       Log.i("AsyncTask", "Cannot read from stream"); 
      } 
      return message; 
     } 
    } 

事情我知道,服务器也得到消息,但直到我重新启动这使我相信,我不是推一个新行或东西这使得它看起来像一个行后服务器它不更新其关闭。然而,这也可能是我不负责任的病人必须阅读的服务器。

读一部分。但是不想工作,林不知道如何调用该方法有它不断地倾听和响应服务器sockt?我试图在doInBackGround返回之前创建一个线程,但是然后应用程序开始工作几秒钟,由于内存不足导致部队关闭?我需要一个线程来不断地听吗?

这您可能已经猜到的全部意义就是让聊天使读取方法最终应该更新我的活动课一个TextView。发送方法是“工作”,但不是它应该的,虽然这可能是我之前说的服务器做一些时髦的buisness。

再一个,它甚至有可能拥有或阅读作为一种方法像我有没有什么有当服务器发送数据的反应,然后调用方法?

编辑 现在我已经搬到读一部分,或至少其中一部分变成doInBackGround所以它现在

这有变化而简单地硬编码服务器中的打印行让我读到在客户端排队,所以即时猜测其工作现在非常好。

它是如何看?这是完全垃圾代码,应该采取其他方式?得到了我的功能,但从来没有不好学习做得更好,所以说:)。

回答

0

您应该在AsyncTask的doInBackground()方法中将您的写入和读取操作都写入Socket,因为两者都需要时间并可能会阻塞主要(UI)线程。我不知道如何调用上面的write()方法,但是您也可能想看看question that might be related

+0

我实例化ServerTask类在我的主,并简单做serverTask.write(tbMessage.getText()。的toString());.考虑在异步任务中使用它,但我不知道如何在不使异步的情况下调用write并编写params [0],但这意味着我必须每次都执行serverTask.execute(要写入的文本)并通过每次都建立一个新的连接? – Gvs 2012-02-17 03:15:25

+0

还有一件事,我打开doInBackGround中的流不会使它写在那里,当我使用流? – Gvs 2012-02-17 03:22:20

+0

您可以将读/写写入AsyncTasks并将该流作为参数传递。在上面的代码中,doInBackground()方法中的代码将在后台执行,以及由于您正在从doInBackground()调用它而调用read()。 write()看起来不像你所包含的代码。 – jengelsma 2012-02-17 15:13:07