在为每条消息创建新套接字时,TCP上的DataOutputStream工作得更快

时间:2018-01-28 20:00:32

标签: android sockets tcp

在尝试创建一个允许我向IoT设备发送简单字符串的简单Android应用程序时,我使用的代码在每次发送字符串时初始化一个新套接字。我认为套接字在再次关闭之前发送多个字符串会更好,但结果却很慢。我没有足够的经验去实现这里发生的事情。

public class sendString extends AsyncTask<String, String, Socket> {
int brightness;
private int oldbrightness;
void changeBrightness(int newbright){
    oldbrightness = brightness;
    brightness = newbright;
}
@Override
protected Socket doInBackground(String... strings) {
    try {
        Socket socket = new Socket(strings[0], 80);
        socket.setTcpNoDelay(true);
        DataOutputStream DOS = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        while (!isCancelled()) {
            if (oldbrightness != brightness) {
                DOS.writeUTF("\"sr1\":" + brightness + " ");
                DOS.flush();
            }
        }
        socket.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
protected void onCancelled(){
    return;
}
protected void onProgressUpdate(String... progress){

}
@Override
protected void onPostExecute(Socket socket){
    return;
}

}

这是我的代码,它通过一个套接字发送多个字符串。单击搜索栏时调用该函数,每次搜索栏移动时亮度都会更改,并且在搜索栏被释放时调用cancel(true)。我的代码是错误的还是有一个不同的原因,为什么这个方法会这么慢?

旧代码:

public class sendString extends AsyncTask<String, Void, Socket> {
@Override
protected Socket doInBackground(String... strings) {
    try {
        Socket socket = new Socket(strings[0], 80);
        DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
        DOS.writeUTF(strings[1]);
        socket.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

} 每次搜索栏移动时都会调用它。

1 个答案:

答案 0 :(得分:1)

不同之处在于,第一个版本在CPU吸烟循环中无限地发送消息,而第二个版本在每个搜索栏移动时只执行一次,这应该总是更快。

您正在比较苹果和橘子。

在安装搜索栏侦听器之前,您应该在此方法之外打开 这个方法,并且每次调用只发送一条消息。