2011-06-07 44 views
1

我正在向一个套接字写入一堆数据,然而,在64k左右的东西写入后,套接字被关闭,出现“对等连接重置”错误。我相信发生的事情是读取套接字(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

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

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

+0

谢谢!现在我正在使用socket.accept()来创建客户端(如您在上面的伪代码中看到的那样)。由于此时我不想调用accept(),创建客户端然后调用accept()打开连接的最佳方法是什么? – Nick 2011-06-07 02:01:03

+1

@Nick accept()不会创建客户端。它*接受*客户。客户端创建客户端并进行连接。只要在准备好时调用accept()即可。 – EJP 2011-06-07 02:22:19