繁体   English   中英

Android套接字输入流读取(后跟EPIPE)

[英]Android socket inputstream read (followed by an EPIPE)

我正在创建一些客户端套接字软件来从服务器读取事件。 (例如,流媒体股票报价)。

问题: .read(b); 立即返回值为-1 这导致infinte循环,手机变得非常热。 此外,对s.isConnected(),isOpen(),isBound()的所有检查都返回true。 套接字本质上是连接的 (这是一个错误场景,因此.setSoTimeout(x)的任何值都没有效果.12分钟,或留空.read(b)总是立即返回-1)。

当我稍后写入它时,通过getOutputStream(),我收到一个异常EPIPE(断开的管道)。

这是核心代码(为简洁起见,省略了日志语句/值检查)。

s.connect(new InetSocketAddress(host, port), CONNECT_TIMEOUT_MILLIS);

byte[] b = new byte[1024];
while (s.isConnected()) {
    int bytesToRead = s.getInputStream().read(b);
    if (bytesToRead <= 0) {
        LOGGER.debug("no bytes read? trying again.");
        continue;
    }
    processFrame(b);
}

如果我在手机上循环3g,它可以正常工作。 有时它会进入这种奇怪的状态。

难道我做错了什么? 这是预期的行为吗? 是否有我可以看到的现有代码来展示在Android上进行套接字编程的正确方法?

如果read(byte[], ...)返回<0,则对等体已关闭连接,因此您必须关闭套接字并退出循环。 永远不会有更多的数据。

输入流是阻塞的,因此read(byte[], ...)的唯一方法是返回零,如果指定零长度缓冲区或零长度,则取决于您调用的过载。 正如你没有这样做,它永远不会返回零。

相反,它将完全按照它在Javadoc中所说的内容执行:返回-1表示EOS,或阻塞直到至少有一个字节的数据可用。

难道我做错了什么?

几乎所有的。 您对<= 0循环测试完全没有意义且完全不正确。 测试isConnected()也是如此。 这只会告诉你是否连接过这个Socket 它不会随着连接状态而改变。 返回代码-1告诉你。 你的循环应该是:

while ((bytesToRead = s.getInputStream().read(b)) > 0)
{
    // do something with b[0..bytesToRead -1].
}
s.close();

我没有问题使用以下代码:

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            myLineProcess(line); //here you process you line result
        }

祝好运。

嗯,我不知道这是否适合这个,但我仍然想给你代码,每次都很好。

请保持简单,

尝试使用InputStream, InputStreamReader, BufferedReader, OutputStream, PrintWriter.

客户端:

Socket s = new Socket();
s.connect(new InetSocketAddress("Server_IP",Port_no),TimeOut); 
// Let Timeout be 5000

服务器端:

ServerSocket ss = new ServerSocket(Port_no);
Socket incoming = ss.accept();

从套接字读取:

InputStream is = s.getInputStream();
InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);
boolean isDone = false;

String s = new String();

while(!isDone && ((s=br.readLine())!=null)){

     System.out.println(s);   // Printing on Console

 }

写入套接字:

OutputStream os = s.getOuptStream();
PrintWriter pw = new PrintWriter(os)

pw.println("Hello");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM