Java Android:连续套接字写入

Java Android:连续套接字写入,java,android,sockets,Java,Android,Sockets,我不熟悉Java和Android编程,但有一个项目需要我这么做 应用程序向服务器发送字节,服务器接收发送给它的所有信息,并执行等效命令。客户端和服务器处于独占链接中,因此我不会担心安全问题 public class NetworkTask extends AsyncTask<Void, byte[], Boolean> { OutputStream dataOut; //Network Output Stream @Override protected vo

我不熟悉Java和Android编程,但有一个项目需要我这么做

应用程序向服务器发送字节,服务器接收发送给它的所有信息,并执行等效命令。客户端和服务器处于独占链接中,因此我不会担心安全问题

public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
    OutputStream dataOut; //Network Output Stream

    @Override
    protected void onPreExecute() {
        Log.i("AsyncTask", "onPreExecute");
    }

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

        boolean result = false;

        while (sendData) { //While Boolean sendData is true

            try {
                gsocket = new Socket(roubotIP, roubotPort);

                byte[] data = EncodingUtils.getAsciiBytes(outData);

                Log.i("Data: ", outData);
                dataOut = new DataOutputStream(gsocket.getOutputStream());

                dataOut.write(data);

            } catch (UnknownHostException e) {
                Log.i("Socket: ","Unkown host");
                e.printStackTrace();
                result = true;
            } catch (IOException e) {
                e.printStackTrace();
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
                result = true;
            }
        }

        try {
            dataOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}
公共类NetworkTask扩展了AsyncTask{
OutputStream dataOut;//网络输出流
@凌驾
受保护的void onPreExecute(){
Log.i(“AsyncTask”、“onPreExecute”);
}
@凌驾
受保护的布尔doInBackground(Void…params){
布尔结果=假;
while(sendData){//while Boolean sendData为true
试一试{
gsocket=新插座(roubotIP、roubotPort);
字节[]数据=EncodingUtils.getAsciBytes(outData);
Log.i(“数据:”,outData);
dataOut=新的DataOutputStream(gsocket.getOutputStream());
数据输出。写入(数据);
}捕获(未知后异常e){
Log.i(“套接字:,“未知主机”);
e、 printStackTrace();
结果=真;
}捕获(IOE异常){
e、 printStackTrace();
结果=真;
}捕获(例外e){
e、 printStackTrace();
结果=真;
}
}
试一试{
dataOut.close();
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
}
使用上面的代码,我能够建立到服务器的连接,但是数据只会每隔1-2秒发送/写入套接字

是否有一种方法可以持续执行此操作?或者以最小的延迟(大约0.5秒或更少?)

电池寿命对我来说不是一个问题,我接受插座持续激活有其缺点

谢谢

  • 在“while”块中创建多个套接字
  • 在第二个链接中,您还可以在“while”块中创建多个输出流
  • 试着这样做:

    public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
        OutputStream dataOut; //Network Output Stream
    
        @Override
        protected void onPreExecute() {
            Log.i("AsyncTask", "onPreExecute");
        }
    
        @Override
        protected Boolean doInBackground(Void... params) {
            try {
                gsocket = new Socket(roubotIP, roubotPort);
                dataOut = new DataOutputStream(gsocket.getOutputStream());
            } catch (UnknownHostException e) {
                Log.i("Socket: ","Unkown host");
                e.printStackTrace();
                return false;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            while (sendData) { //While Boolean sendData is true
                try {
                    byte[] data = EncodingUtils.getAsciiBytes(outData);
                    Log.i("Data: ", outData);
                    dataOut.write(data);
                    dataOut.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }
            try {
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
    }
    
    公共类NetworkTask扩展了AsyncTask{
    OutputStream dataOut;//网络输出流
    @凌驾
    受保护的void onPreExecute(){
    Log.i(“AsyncTask”、“onPreExecute”);
    }
    @凌驾
    受保护的布尔doInBackground(Void…params){
    试一试{
    gsocket=新插座(roubotIP、roubotPort);
    dataOut=新的DataOutputStream(gsocket.getOutputStream());
    }捕获(未知后异常e){
    Log.i(“套接字:,“未知主机”);
    e、 printStackTrace();
    返回false;
    }捕获(例外e){
    e、 printStackTrace();
    返回false;
    }
    while(sendData){//while Boolean sendData为true
    试一试{
    字节[]数据=EncodingUtils.getAsciBytes(outData);
    Log.i(“数据:”,outData);
    数据输出。写入(数据);
    dataOut.flush();
    }捕获(例外e){
    e、 printStackTrace();
    返回false;
    }
    }
    试一试{
    socket.close();
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回true;
    }
    }
    
    我的java已经生锈了,但在我看来,每次通过循环都在创建一个新的套接字,我认为这不是你想要的,这肯定会消耗时间。@Duck,我也尝试过这样做:但字节只发送/写入服务器一次。