使用套接字的应用程序在尝试连接到服务器时冻结

时间:2012-12-25 23:23:42

标签: android sockets

我正在做一些从手机向PC发送数据的应用程序。我正在使用socket来做到这一点。当服务器在线时它可以工作,但当我尝试连接错误的IP /端口或服务器没有运行时,应用程序冻结,我什么都不能做。这是因为手机上的客户端试图连接到服务器。

我有主要课程:

Thread cThread = new Thread( new TCPClient( ip, port, message, context) );
cThread.start();

新TCPClient中存在上下文,因为我需要在发送消息或出现错误时进行Toast。在TCPClient类中有:

public void run(){
try {
InetAddress serverAddr = InetAddress.getByName(s_ip);
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, s_port); 

当服务器在线时,它会转到:

Log.d("TCP", "C: Sending: '" + s_msg + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(s_msg);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");

但是当服务器脱机或我放错了ip / port我的应用程序冻结了。我暂时无能为力。

是否有任何解决办法强制停止尝试连接服务器一段时间后?例如,在5秒后,应用程序将捕获并给我错误。

我尝试使用AsyncTask执行此操作,然后即使客户端尝试连接到服务器,应用程序仍然正常工作,但是在我无法接受的时间后出现错误的Toast,所以我想要一个解决方案,当客户端无法解决时会给我错误与服务器连接例如5秒钟。

2 个答案:

答案 0 :(得分:6)

您可以设置连接超时。您必须使用Socket类的不同构造函数。 Insead:

Socket socket = new Socket(serverAddr, s_port); 

使用:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(serverAddr, s_port), 5000);

如果超时,则抛出异常。

答案 1 :(得分:1)

也许您没有设置timeout connection所以默认情况下它是“0”,这意味着它永远不会超时,因此您可以将超时设置为1分钟冻结超过一分钟。