套接字关闭错误

时间:2011-06-07 00:30:22

标签: java android sockets

我正在向套接字写入一堆数据,但是,在写入64k左右之后,套接字将关闭并显示错误“Connection by peer”。我相信正在发生的事情是,读取套接字(Android媒体播放器)的内容在尝试读取比套接字中提供的数据更多的数据时正在消亡。这是一首流式传输的歌曲,当id3标签相当大时,它会失败。但是,当我从歌曲中删除id3信息时,它可以正常工作。

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

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

    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);           

    }

1 个答案:

答案 0 :(得分:1)

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

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