android套接字等待传入数据的指定时间

时间:2015-07-07 10:00:53

标签: java android sockets android-asynctask

在我最近的应用程序中,我尝试通过Socket连接到服务器并向其发送一些数据,并等待指定的时间进行服务器响应。

之后关闭连接。 (ServerConnectMyAsyncTask

1 - 由于显而易见的原因,我使用AsyncTask,按下按钮后会运行。

public void btn_login_clicked(View v)
{
    if(ed1.getText().length()>0 && ed2.getText().length()>0)
    {
            progress = ProgressDialog.show(this, "Please Wait...", "Waiting for Server...",true);
            ServerConnect conecction = new ServerConnect();
            conecction.execute();
    }else
    {
            Toast.makeText(this, "user and/or pass is wrong"+ed2.getText().toString(),Toast.LENGTH_SHORT).show();
    }
}

在我的AsyncTask中,我创建一个套接字并为IP和端口初始化它。

之后我将数据发送到服务器,等待5秒。

在此期间,如果服务器重播,我有意将我转移到MainActivity。如果不想

1-关闭套接字

2-取消progressDialog

3-让用户再次按下按钮。

代码:

public class ServerConnect extends AsyncTask<Void, Void, Void>
{
    /*my global parameter*/
    public ServerConnect()
    {
        /*do some initialization */
    }
@Override
protected Void doInBackground(Void... arg0) {
    PrintWriter out = null;
    String Packet = null;

    try {
        InetAddress serverAddr = InetAddress.getByName(ip);
        socket = new Socket(serverAddr, port); //connect to server
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        Thread.sleep(200);
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
        Packet = Preamble + Username + "\n" + Pass; 
        Thread.sleep(200);
        out.println(Packet); // send data
        long timeNow = System.currentTimeMillis();
        while(true)
        {
            br.read(myData);
            ReceivedText = new String(myData);
            Thread.sleep(10);
            if(ReceivedText.length() > 0)
                break;
            if(System.currentTimeMillis() - timeNow >= 5000) // for getting rid of Progress dialig and let user try again
            {
                progress.dismiss();
                socket.close();
                socket = null;
                break;
            }
        }
        if(ReceivedText.toCharArray()[0] == 'T')// if ok go to main activity
        {
            ReceivedText = "";
            Intent myIntent = new Intent(LoginPage.this, MainActivity.class);
            LoginPage.this.startActivity(myIntent);
        }
        if(ReceivedText.toCharArray()[0] == 'X') // if not do nothing yet
        {
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}
}   

问题是即使我在服务器休息20秒myAsyncTask等待后回复,并且在5秒后从未解除progressDialog并获取数据并转到MainActivity

我的实施错误了吗?

任何帮助都会很棒。

提前致谢

1 个答案:

答案 0 :(得分:0)

  

我的实现错了吗?

烨。

摆脱所有睡眠和System.currentTimeMillis()调用,并以毫秒为单位调用Socket.setSoTimeout()所需的读取超时。如果超时在read()调用期间到期,它将抛出SocketTimeoutException,因此您应该抓住它。

br.read(myData);

如果不将read()返回的结果存储到变量中,则无法编写正确的网络代码。你必须检查它是否为-1,表示流的结束,或者是一个正值,表示实际读取了多少字节。