当前位置: 首页 > 知识库问答 >
问题:

Java套接字读取inputstream而不阻塞

葛承德
2023-03-14

我有一个小问题与Android和IOS之间实现套接字连接。当我使用我的应用程序连接两个Android运行设备时,一切正常。但是当我必须从Iphone应用程序接收一些数据时,我的readStream函数被阻塞,我可以在另一个部分关闭套接字后接收所有数据,这样我就不能返回任何响应。以下是我用来听的:

try {
    serverSocket = new ServerSocket(5000);
    Log.d("","CREATE SERVER SOCKET");
} catch (IOException e) {
     e.printStackTrace();
}

while(state){
    try {
        if(serverSocket!=null){
            client = serverSocket.accept();
            client.setKeepAlive(true);
            client.setSoTimeout(10000);

            // LOGS
            Log.w("READ","is connected : "+client.isConnected());
            Log.w("READ","port : "+client.getPort());
            Log.w("READ","ipadress : "+client.getInetAddress().toString());



            InputStream is = client.getInputStream();

            Log.w("READ","is Size : "+is.available());

            byte[] bytes = DNSUtils.readBytes(is);
            Log.v("","-------------------------");
            for(int i=0;i<bytes.length;i++){
                Log.w("READ","bytes["+i+"] : "+bytes[i]);
            }
            Log.v("","-------------------------");

            try {
                Log.w("READ","packetType : "+bytes[4]);

                if(bytes!=null)
                    DNSUtils.getPacketType(bytes[4], bytes, client);

            } catch(Exception e){
                e.printStackTrace();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        Log.v("","IOException");
        ResponseERR pack = new ResponseERR();
        ResponseERR.errorMsg = "Socket TimeOut exception!";
        byte[] packet = pack.createNewPacket();

        try {
            if(client!=null){
                OutputStream out = client.getOutputStream();
                out.write(packet);
                out.flush();
                client.shutdownOutput();
                client.close();
                Log.e("READDATAFROMSOCKET","ResponseERR Send.");
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

这里是我用来将InputStream转换为Byte Array的函数:

public static byte[] readBytes(InputStream inputStream) throws IOException {
    // this dynamically extends to take the bytes you read
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

    // this is storage overwritten on each iteration with bytes
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];

    // we need to know how may bytes were read to write them to the byteBuffer
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }

    // and then we can return your byte array.
    return byteBuffer.toByteArray();
}

Iphone/Android应用程序的工作原理如下:

  • 首先,它创建Socket并将数据发送到其他设备,并关闭输出流。
  • 第二部分是解析字节数组,然后使用相同的套接字返回响应。

有没有办法改变我的函数,这样我就可以在不阻塞的情况下读取输入流?

所以问题出在IOS方面,苹果应用编程接口似乎需要关闭创建的套接字的两个流:读/写,这样字节数组就可以发送,这看起来真的很愚蠢,因为这样iphone应用程序就不能接收和解析我的响应。

共有2个答案

鲜于谦
2023-03-14

有了为RIM操作系统编程的经验,我认为所有这些IO操作都应该在不同的线程中执行。主用户界面线程将被要求调用另一个应用程序线程,在那里您将检查异步操作是否完成并采取适当的操作。这样,读取输入流的代码必须在单独的线程中运行。

白子默
2023-03-14

与编辑中的评论相反,这是你的错,不是苹果的错。你需要重新设计你的API。您的readBytes()方法会一直读取流,直到流结束,这只有在对等方关闭连接时才会发生。如果您只想读取一些字节,read(byte[])已经可以读取,并告诉您有多少字节,而无需流结束。我会抛弃这种方法。

 类似资料:
  • 问题内容: 当我直接使用(没有诸如Scanner之类的界面)接收数据时,它不会阻塞。但是,当我尝试使用Scanner时(类似于我们从接收字符串的方式),它确实可以。我想知道这样做的原因,以及所连接的Socket提供给您的InputStream与in的不同之处。 用于测试的客户端(用于两个服务器) 挂起的代码: 不阻塞的代码: 问题答案: (我认为您已经知道了这一点,但是…) 该方法返回当前行的其余

  • 问题内容: 我在我的项目之一中使用Java.net。我写了一个从客户端获取inputStream的App Server。但是有时我的(缓冲的)InputStream无法获得客户端发送到我的服务器的所有OutputStream。我该如何写一个等待或类似的东西,让我的InputStream获得客户端的所有OutputStream? (我的InputStream不是字符串) 谢谢。 问题答案: 例如,你

  • 我在我的一个项目中使用Java.net。我写了一个从客户端获取输入流的应用服务器。但是有时候我的(缓冲的)输入流不能得到客户端发送到我的服务器的所有输出流。我怎么能写一个等待或类似的东西,我的输入流得到客户端的所有输出流? (我的输入流不是字符串) 谢谢。

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 问题内容: 为什么有人会喜欢阻止写而不是非阻止写?我的理解是,仅当您想确保写方法返回后,另一端获得了TCP数据包时,才希望阻止写操作,但是我什至不知道这是可能的。您将必须刷新,而刷新则必须刷新 底层操作系统的写套接字缓冲区 。那么,无阻塞套接字写是否有任何缺点?就性能而言,拥有较大的底层写套接字是否会缓冲一个不好的主意?我的理解是,底层套接字写缓冲区越小,当底层套接字缓冲区已满且isWritabl

  • 问题内容: 我有一个侦听某些x端口的套接字。 我可以从客户端应用程序将数据发送到套接字,但是无法从服务器套接字获得任何响应。 ..此代码部分从服务器读取数据。 但是,直到关闭服务器上的套接字,我才能从服务器读取任何内容。服务器代码不受我控制,无法对其进行编辑。 如何从客户端代码中克服这个问题。 谢谢 问题答案: 为了在客户端和服务器之间进行通信,必须明确定义协议。 客户端代码将阻塞,直到从服务器收