2

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

我有主要课程:

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 秒。

4

2 回答 2

6

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

Socket socket = new Socket(serverAddr, s_port); 

利用:

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

如果超时,则会引发异常。

于 2012-12-26T00:44:57.060 回答
1

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

于 2012-12-26T00:40:31.673 回答