繁体   English   中英

Java套接字客户端程序在哪里超时

[英]where to Time out in java socket client program

我在套接字编排下面,我能够将测试消息成功发布到服务器编排,但是有时该过程等待太长时间,以防万一没有收到响应,有人可以指导我实施超时并在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;
    }

}

您可以使用setSoTimeout将超时添加到套接字:

socket = new Socket(strIp, intPort) ;
socket.setSoTimeout(2000); //2000 milliseconds

read呼叫超时将花费比指定时间更长的时间

当您向socket.setSoTimeout()提供非零值(默认为零,无超时)时,套接字超时(也称为SO_TIMEOUT将在阻塞的read()调用上启用超时。

但是,您的代码的一个更大的问题是使用available() 我不知道您要做什么,但是您做错了。 当前,您的代码不在乎它是否从另一端接收到任何东西,垃圾或全部数据。 为什么在另一端关闭连接以指示所有数据已发送之前不进行读取?

在服务器或客户端套接字中设置套接字超时,如下所示:

Socket socket = new Socket();
socket.setSoTimeout(2000);

要重复尝试直到成功,请将用于启动连接的代码放在自己的方法中,并让该方法从方法的catch语句内部进行调用。 每次发生超时时都会调用catch语句,因此您可以从那里递归地调用该方法,直到成功为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM