【问题标题】:Time out on sending to a server socket发送到服务器套接字超时
【发布时间】:2011-08-17 23:16:31
【问题描述】:
 public void sendToServer(String fileToSend, String ip, int sendPort)
{
    int port = sendPort;
    String url = ip;
    File file = new File(fileToSend);
    String fileName = file.getName();

    Socket sock;
    try {
        sock = new Socket(url,port);

        //Send the file name
        OutputStream socketStream = sock.getOutputStream();
        ObjectOutput objectOutput = new ObjectOutputStream(socketStream);
        objectOutput.writeObject(fileName);

        //Send File
        byte [] mybytearray  = new byte [(int)file.length()];
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        bis.read(mybytearray,0,mybytearray.length);
        OutputStream os = sock.getOutputStream();
        os.write(mybytearray,0,mybytearray.length);
        fileSentOkay();
        os.flush();
        sock.close();

    } catch (UnknownHostException e) {
        hostNotFound();
    } catch (IOException e) {
        hostNotFound();
    }
}

当我在服务器未侦听连接时尝试向服务器发送内容时,手机会继续尝试发送文件。因此,我的 Android 程序最终将强制关闭。

我怎样才能为这件事设定一个时间?我是否必须在发送数据的套接字上使用setSoTimeout() 之类的东西?

【问题讨论】:

    标签: android tcp timeout


    【解决方案1】:

    首先:以防万一:不要在 UI 线程上做网络工作。坏事会发生(tm)

    第二:setSoTimeout() 应该给你一个超时,以防服务器接受连接但没有回复(或者如果网络根本没有回复)。如果连接被拒绝,套接字应该会更快地失败。

    编辑:如果 Socket 类的构造函数已经花费了这么长时间,请尝试使用 connect(SocketAddress, int) 方法。使用InetSocketAddress 作为参数:

    Socket s = new Socket(); 
    s.connect(..., 1000);
    

    【讨论】:

    • 我添加了 sock.setSoTimeout(1000),但似乎没有任何影响。如果我尝试将文件发送到一个不存在的 IP,它仍然会在一段时间后强制关闭。
    • 能否提供导致强制关闭的错误的日志记录?
    • 嘿,我无法在此处进行格式化,因此我在 logcat 文件强制关闭之前将其粘贴到此链接:pastebin.com/PGSGE3cd
    • 注意我的第一个提示:不要在 UI 线程上做网络事情。我用 Socket 类的构造函数中的超时信息更新了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2015-11-14
    • 2020-11-24
    相关资源
    最近更新 更多