如何从另一个类获取Socket的getOutputStream()?

时间:2017-12-27 14:43:38

标签: android sockets

我有两个班级:

  • MainActivity.class
  • ScreenCapture.class

并希望来自位于 MainActivity.class 上的套接字的getOutputStream();

然后我做:

MainActivity.INSTANCE.clientSocket.getOutputStream();

但是在这行中失败^,我没有在这里留下logcat,因为我的logcat没有正确捕获所有事件,但是从这个描述希望有人可以提供帮助。

MainActivity

public class MainActivity extends AppCompatActivity {

public static final MainActivity INSTANCE = new MainActivity();

 public Socket clientSocket;

    private final int SERVERPORT = 101;
    private final String SERVER_IP = "192.168.15.13";

    /////////////////////////////////////////////// CLIENTSOCKET //////////////////////////////////////////////////////
    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {

                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                clientSocket = new Socket(serverAddr, SERVERPORT);

                new Thread(new CommsThread()).start();

            } catch (Exception e1) {
                System.out.println(e1.toString());
            }

        }
    }

    class CommsThread implements Runnable {

        @Override
        public void run() {

            try {
                System.out.println("Waiting for server request");

                while(clientSocket.isConnected()){

                    BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())),true);

                    if (reader.ready()) {
                        String line;
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);

                            if(line != null && !line.trim().isEmpty()) {

                                if(line.equalsIgnoreCase("screen")){

                                   // Do something

                                    out.flush();

                                }

                                if(line.equalsIgnoreCase("exit")) break;
                            }
                        }

                    }
                    Thread.sleep(100);
                }
                System.out.println("Shutting down Socket!!");
                clientSocket.close();
            } catch (Exception e1) {
                System.out.println(e1.toString());
            }

        }

    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new ClientThread()).start();
    }

抓屏

public class ScreenCaptureClass {

   @UiThread
   public boolean takeScreenshot(@NonNull Context context) {

       //...

    imageReader.setOnImageAvailableListener(new OnImageAvailableListener() {

     @Override
     public void onImageAvailable(final ImageReader reader) {

        new AsyncTask<Void, Void, Bitmap>() {

        @Override
        protected Bitmap doInBackground(final Void... params) {

        // ...

        OutputStream outs = MainActivity.INSTANCE.clientSocket.getOutputStream(); // <= Error is here

        }

       }

     }

    }

   }

 }

1 个答案:

答案 0 :(得分:0)

尝试将套接字的引用传递给ScreenCaptureClass,您可以尝试以下方法:

  • 您可以通过ScreenCaptureClass构造函数传递套接字(可能是最好的方法)。
  • ScreenCaptureClass内,你可以添加一个静态变量,如private static OutputStream outputStream和一个从你的MainActivity调用的setter:

    public static void setOutputStream(OutputStream os) {
        outputStream = os;
    }