繁体   English   中英

空套接字上的getOutputStream吗?

[英]getOutputStream on a null socket?

我是该网站的新手,我在这里问有关套接字和线程的问题。 我有这段代码,它给了我下面的错误:

    public class Conferma extends AppCompatActivity {

    private final String TAG = "Conferma";
    public Socket socket;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.conferma);

        final EditText etTavolo = (EditText) findViewById(R.id.etTavolo);
        final RadioButton rbSi = (RadioButton) findViewById(R.id.rbSi);
        RadioButton rbNo = (RadioButton) findViewById(R.id.rbNo);
        Button bInvia = (Button) findViewById(R.id.bInvia);

        Thread t = new Thread(new ClientThread());
        t.start();

        bInvia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String ordine = getIntent().getExtras().getString("ordine");
                if(etTavolo.getText().toString().equals("")){
                    AlertDialog.Builder builder = new AlertDialog.Builder(Conferma.this);
                    builder.setMessage("Inserire il numero del tavolo!").setNegativeButton("Riprova!", null).create().show();
                }
                ordine = ordine + "Tavolo: " + etTavolo.getText().toString() + "/";
                if(rbSi.isChecked()) {
                    ordine = ordine + "Coperto: Sì/";
                }
                else{
                    ordine = ordine + "Coperto: No/";
                }
                Log.d(TAG, ordine);

                //invio informazione
                inviaStringa(view, ordine);
            }
        });
    }

    private void inviaStringa(View view, String ordine) {

        try{
            OutputStream s = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(s);
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            PrintWriter out = new PrintWriter(bufferedWriter, true);
            out.println(ordine);
        } catch (Exception e) {
            Log.e(TAG, "Errore: " + e);
        }
    }

    private class ClientThread implements Runnable {

        private static final int SERVER_PORT = 6000;
        private static final String SERVER_IP = "109.115.84.90";
        private static final String TAG = "ClientThread";

        @Override
        public void run() {
            try {
                InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
                Log.d(TAG, "creato");
                socket = new Socket(serverAddress, SERVER_PORT);
            } catch (UnknownHostException e) {
                Log.e(TAG, "Errore: " + e);
            } catch (IOException e) {
                Log.e(TAG, "Errore: " + e);
            }
        }
    }
}

错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.io.OutputStream java.net.Socket.getOutputStream()”

现在,从错误中我认为问题出在套接字上,这意味着未初始化。 但是,如果我在创建简单Thread的过程中调用ClientThread方法,为什么不初始化呢? 感谢您的帮助,对不起,如果我不能比这更清楚! :((

最好的(也是最正确的)方法是使用AsyncTask (正如我在评论中所写)。

如果要使用该类,那么有很多解决方案,在这里我只建议一个我认为更干净的解决方案,在另一个文件中创建类ClientThread,然后在inviaStringa方法中添加:

ClientThread:

private class ClientThread implements Runnable {    
   private static final int SERVER_PORT = 6000;
         private static final String SERVER_IP = "109.115.84.90";
            private static final String TAG = "ClientThread";
        private Socket socket;

    public ClientThread(){
                try {
                    InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
                    Log.d(TAG, "creato");
                    socket = new Socket(serverAddress, SERVER_PORT);
                } catch (UnknownHostException e) {
                    Log.e(TAG, "Errore: " + e);
                } catch (IOException e) {
                    Log.e(TAG, "Errore: " + e);
                }
            }

    }

            @Override
            public void run() {
    }
            private void inviaStringa(View view, String ordine) {

            try{
                OutputStream s = socket.getOutputStream();
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(s);
                BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
                PrintWriter out = new PrintWriter(bufferedWriter, true);
                out.println(ordine);
            } catch (Exception e) {
                Log.e(TAG, "Errore: " + e);
            }
        }

        }

那么在Conferma中,您不需要更多的声明套接字,而只需执行此操作

Thread t = new Thread(new ClientThread());
        t.start();

...//when you've to send the String

t.inviaStringa(view, ordine);

暂无
暂无

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

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