我有下面的套接字编程,我能够成功地将测试消息发送到服务器编程,但是有时候进程等待太长时间没有收到响应,有人请指导我实现超时并重试相同的连接说2秒后。
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Put_msg {
public static String Post(String strRequestMessage, String strIP,
int intPort) throws Exception {
String strResponseMessage = "";
try{
Socket socket = null;
socket = new Socket(strIP, intPort);
BufferedInputStream bin = new BufferedInputStream(
socket.getInputStream());
PrintWriter pw1 = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
pw1.println(strRequestMessage);
pw1.flush();
strResponseMessage = readInputStream(bin);
socket.close();
socket = null;
}catch(Exception e){
strResponseMessage = "ERROR:Post_JAVA:"+e.toString();
return strResponseMessage;
}
return strResponseMessage;
}
public static String readInputStream(BufferedInputStream in)
throws Exception {
String read_msg = "";
int i = in.read();
if (i == -1) {
return "-1";
}
read_msg = read_msg + (char) i;
int available = in.available();
if (available > 0) {
byte[] Data = new byte[available];
in.read(Data);
read_msg = read_msg + new String(Data);
}
return read_msg;
}
}
答案 0 :(得分:1)
您可以使用setSoTimeout
:
socket = new Socket(strIp, intPort) ;
socket.setSoTimeout(2000); //2000 milliseconds
超时read
超时指定的时间超过指定时间
答案 1 :(得分:0)
SO_TIMEOUT
提供非零值(默认值为零,没有超时)时,套接字超时aka read()
将启用阻塞socket.setSoTimeout()
调用的超时。
但是,代码的一个更大问题是使用available()
。我不知道你要做什么,但你做错了。目前,您的代码并不关心它是从另一端接收任何内容,垃圾还是全部数据。为什么不读取,直到另一端关闭连接以表示所有数据都已发送?
答案 2 :(得分:-1)
在服务器或客户端套接字中设置套接字超时,如下所示:
Socket socket = new Socket();
socket.setSoTimeout(2000);
要重复尝试直到成功,请将代码用于在自己的方法中启动连接,并让方法从方法的catch语句中调用自身。每次超时都会调用catch语句,因此您可以从那里递归调用该方法,直到成功为止。