【问题标题】:How to listen DataInputStream Socket in Android without sending data?如何在不发送数据的情况下在 Android 中监听 DataInputStream Socket?
【发布时间】:2018-08-15 05:08:46
【问题描述】:

我写了一个类,我可以在其中通过套接字发送和接收数据。在这个类中,首先,我使用特定的端口和 IP 连接到套接字,然后初始化 outputstrem 和 inputstram。

我可以轻松发送和接收数据,但只有在我这边有请求时才能接收数据。有时我必须在不发送数据的情况下接收新信息。

如何在不发送数据的情况下接收数据(监听套接字)?

public class INetConnection{

    private DataOutputStream       outputStream;
    private DataInputStream inputStream;
    private Callback mCallback;
    private Socket socket;
    private byte[] rec_buffer;

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    public void connectToNetwork() {
        if (socketConnect()) {
            try {
                outputStream = new DataOutputStream(getSocket()
                        .getOutputStream());
                inputStream = new DataInputStream(getSocket().getInputStream());
                Log.i("Log", "Streams Created!");
                receiveData();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private boolean socketConnect() {
        try {
            socket = new Socket(SERVER_IP, SERVER_PORT);
            Log.i("Socket", "Connection stablished");
            return true;
        } catch (UnknownHostException e) {
            Log.d("Exception mode", "UnknownHostException");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d("Exception mode", "IOException");
            e.printStackTrace();
        }
        return false;
    }

    public void sendData(final byte[] data) {
        outputStream.write(data, 0, data.length);
    }

    private void receiveData(){
        // Again, probably better to store these objects references in the support class
        if(getSocket() != null && getSocket().isConnected()){
            try {
                Log.i("Log", "Ready to receive!");
                byte[] buffer  = new byte[265536];
                int size = 0;
                while ((size = inputStream.read(buffer)) != -1){
                    Log.i("Log", "Data's been read fully from server");
                    rec_buffer  = new byte[size];
                    rec_buffer = Arrays.copyOfRange(buffer, 0 , size);
                    for (int i = 0; i< size; i++)
                        Log.i("Log", "Data i: " + rec_buffer[i]);
                }
            } catch (IOException e) {
                Log.e("Log", "Error occured during receiving data");
                e.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 只从输入流中读取,不要使用输出流。为什么会有问题?

标签: android sockets datainputstream


【解决方案1】:

您通过套接字连接到的服务器是您自己的服务器使用您自己的实现还是其他人的服务器?

通常,服务器的行为方式是仅根据请求发送数据(至少 REST API 的行为方式是这样)。但是,如果那是您自己的服务器,您可以将其设置为一旦套接字连接,它将开始向客户端发送数据。这样,您客户端上的 InputStream 应该能够在不发送任何内容的情况下接收数据。

如果服务器不是您要修改的,并且希望客户端首先发送请求,那么我想除了首先从客户端发送数据之外,您无能为力。

【讨论】:

  • 这个服务器是给我们的,有一个服务可以发送在不同地区实施的几个电子设备的随机数据,我必须用旧数据修改新数据,但我不知道具体是哪个应该请求数据类型,所以我必须只听而不是请求和听。有没有办法像聊天应用一样听?
  • 聊天应用程序如何监听?
  • 服务API怎么样?也许你可以稍微描述一下,把名字和东西改一下(对于机密问题),我们就可以大致了解它是怎样的了。 @greenapps,聊天应用程序通常使用 websockets 或一些围绕它的包装库(如 Socket.io)连接。他们能够在不发送任何内容的情况下获取数据的方式是因为服务器知道何时发送给他们。所以,这取决于服务器的实现。如果服务器能够在检测到新的套接字连接后立即开始发送数据,则客户端将立即获取数据(加上网络时间)
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2016-02-16
  • 2016-04-01
  • 1970-01-01
相关资源
最近更新 更多