我正在做一些从手机向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秒钟。
答案 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分钟冻结超过一分钟。