发送到服务器套接字超时

时间:2011-05-03 18:53:13

标签: android tcp timeout

 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()之类的内容?

1 个答案:

答案 0 :(得分:0)

第一:以防万一:不要在UI线程上做网络内容。坏事会发生(tm)

第二:setSoTimeout()应该在服务器接受连接时给你超时,但是不回复(或者根本没有来自网络的回复)。如果连接被拒绝,则套接字应该明显更快地失败。

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

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