在java socket客户端程序中超时的位置

时间:2015-01-05 06:28:52

标签: java sockets timeout

我有下面的套接字编程,我能够成功地将测试消息发送到服务器编程,但是有时候进程等待太长时间没有收到响应,有人请指导我实现超时并重试相同的连接说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;
    }

}

3 个答案:

答案 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语句,因此您可以从那里递归调用该方法,直到成功为止。