我在读取/写入我正在构建应用程序的tcp服务器时遇到了一些麻烦。在最近的一个帖子中,我被建议使用服务,但这是一个学校的项目,建议asyncTask所以我也可以这样做。
所以我得到的类是我的活动类和异步,活动中没有任何有趣的事情,但是发送一个字符串,这个字符串正在使用异步的字符串。
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中返回之前创建一个线程但是由于内存不足,应用程序启动工作几秒钟就会关闭我需要一个线程来不断听吗?
你可能猜到的这一点的重点是进行聊天,因此read方法最终应该更新我的activity类中的textView。 send方法是“正常工作”,但不应该如此,尽管这可能就像我之前所说的那样,服务器做了一些时髦的商务。
另一个问题是,甚至可以将读取作为一种方法,或者在服务器发送数据然后调用方法时必须做出反应吗?
修改的 我现在已经移动了读取部分,或者至少将其中的一部分移动到doInBackGround,所以它现在
dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
message = dis.readLine();
Log.i("AsynkTask", "Read : "+message+" this is doInBackGround!");
这个改为简单地对服务器中的打印行进行硬编码让我在客户端读取了这一行,所以我猜测它现在的工作效果很好。
它看起来如何?它是完全废话这个代码,应该以其他方式完成吗?得到了我的功能,但从来没有学过如何做得更好,所以说:)。
答案 0 :(得分:0)
你应该在AsyncTask的doInBackground()方法中同时写入和读取Socket,因为这两者都需要时间并且可能会阻塞主(UI)线程。我不知道你如何调用上面的write()方法,但你可能也想看看这个question that might be related。