【问题标题】:Socket closing with error套接字关闭错误
【发布时间】:2011-06-07 09:43:50
【问题描述】:

我正在向套接字写入一堆数据,但是,在写入大约 64k 之后,套接字被关闭并出现错误“对等连接重置”。我相信正在发生的事情是,当尝试读取比套接字可用的更多数据时,正在读取套接字(Android 媒体播放器)的内容正在死亡。这是一首正在流式传输的歌曲,当 id3 标签相当大时,它会失败。但是,当我从歌曲中删除 id3 信息时,它工作正常。

由于我认为当没有足够的数据时读取端会失败,所以我想知道是否可以在调用 socket.accept() 接受连接以读取它之前将一堆数据写入套接字。我的想法是,当媒体播放器连接到套接字时,将有足够的数据供它读取,因此不会崩溃。那么你可以在accept()之前调用write()吗?

这是我当前代码的一些伪代码:

    ServerSocket socket = new ServerSocket(port, 0, InetAddress.getByAddress(new byte[] {127,0,0,1}));

    socket.setSoTimeout(10000);
    port = socket.getLocalPort();

    Socket client = socket.accept();

    ...

    while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {

        client.getOutputStream().write(buff, 0, readBytes);           

    }

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    这通常意味着您已写入已被另一端关闭的连接。换句话说,应用程序协议错误。 64k 可能只是代表您和对等方之间的缓冲量。

    如果它指的是服务器,那么您关于在 accept() 之前写入套接字的问题是没有意义的。但是,如果您的意思是 client 写入套接字,那确实会发生。客户端可以在服务器调用accept之前连接、写入(直到可用缓冲的限制)和关闭。这是由于 TCP 'backlog' 队列导致 TCP 堆栈异步完成连接并将它们排队,准备好被应用程序接受。

    【讨论】:

    • 谢谢!现在我正在使用 socket.accept() 来创建客户端(如您在上面的伪代码中所见)。由于此时我不想调用accept(),那么创建客户端然后调用accept() 来打开连接的最佳方法是什么?
    • @Nick accept() 不会创建客户端。它接受客户。客户端创建客户端并连接。准备好后只需调用 accept() 即可。
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2013-05-23
    • 1970-01-01
    • 2014-08-28
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多