在我最近的应用程序中,我尝试通过Socket连接到服务器并向其发送一些数据,并等待指定的时间进行服务器响应。
之后关闭连接。 (ServerConnect
为MyAsyncTask
)
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
。
我的实施错误了吗?
任何帮助都会很棒。
提前致谢
答案 0 :(得分:0)
我的实现错了吗?
烨。
摆脱所有睡眠和System.currentTimeMillis()
调用,并以毫秒为单位调用Socket.setSoTimeout()
所需的读取超时。如果超时在read()
调用期间到期,它将抛出SocketTimeoutException
,因此您应该抓住它。
br.read(myData);
如果不将read()
返回的结果存储到变量中,则无法编写正确的网络代码。你必须检查它是否为-1,表示流的结束,或者是一个正值,表示实际读取了多少字节。