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

Jak*_*kub 2 sockets android

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

我有一个主要课程:

Thread cThread = new Thread( new TCPClient( ip, port, message, context) );
cThread.start();
Run Code Online (Sandbox Code Playgroud)

新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); 
Run Code Online (Sandbox Code Playgroud)

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

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.");
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试用AsyncTask做这个,然后应用程序工作,即使客户端尝试连接到服务器,但是在我接受时间之后出现错误的Toast,所以我想要一个解决方案,当客户端无法连接服务器时会给我错误在例如5秒.

Tom*_*mik 6

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

Socket socket = new Socket(serverAddr, s_port); 
Run Code Online (Sandbox Code Playgroud)

使用:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(serverAddr, s_port), 5000);
Run Code Online (Sandbox Code Playgroud)

如果超时,则抛出异常.