Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字TCP android java到java->;客户端在out.println(消息)上发送错误消息_Java_Android_Tcp_Message_Printwriter - Fatal编程技术网

套接字TCP android java到java->;客户端在out.println(消息)上发送错误消息

套接字TCP android java到java->;客户端在out.println(消息)上发送错误消息,java,android,tcp,message,printwriter,Java,Android,Tcp,Message,Printwriter,我已经在我的PC上实现了一个Java TCP服务器,它将接受运行客户端的Android设备发送的传入消息,这也是实现的。服务器只需要从Android设备接收此消息并在其窗口上显示即可。我能够成功地连接(我后来解释了为什么我相信),但我无法发送消息。下面是代码中出现错误的部分: if (out != null && !out.checkError()) { out.println(message); out.flush(); } 我用Log

我已经在我的PC上实现了一个Java TCP服务器,它将接受运行客户端的Android设备发送的传入消息,这也是实现的。服务器只需要从Android设备接收此消息并在其窗口上显示即可。我能够成功地连接(我后来解释了为什么我相信),但我无法发送消息。下面是代码中出现错误的部分:

if (out != null && !out.checkError()) {
        out.println(message);
        out.flush();
    }
我用Log.e进行了测试,但它不满足条件

出去空的

如果我删除'=“null”条件,我得到的错误如下:

07-07 23:20:00.581 4368-4368/delfino.tchau_papeletas D/AndroidRuntime: Shutting down VM
07-07 23:20:00.585 4368-4368/delfino.tchau_papeletas E/AndroidRuntime: FATAL EXCEPTION: main
Process: delfino.tchau_papeletas, PID: 4368
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
    at android.view.View.performClick(View.java:6259)
    at android.view.View$PerformClick.run(View.java:24732)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6592)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
    at android.view.View.performClick(View.java:6259) 
    at android.view.View$PerformClick.run(View.java:24732) 
    at android.os.Handler.handleCallback(Handler.java:789) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6592) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.PrintWriter.checkError()' on a null object reference
    at delfino.tchau_papeletas.TCPClient.sendMessage(TCPClient.java:84)
    at delfino.tchau_papeletas.MainActivity.Fazer_Upload(MainActivity.java:187)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
    at android.view.View.performClick(View.java:6259) 
    at android.view.View$PerformClick.run(View.java:24732) 
    at android.os.Handler.handleCallback(Handler.java:789) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6592) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 
mensagem = Codigo.getText().toString();
在主要活动中,我们有:

public TCPClient mTcpClient; 

public class connectTask extends AsyncTask<String,String,TCPClient> {
    @Override
    protected TCPClient doInBackground(String... message) {
        mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() {
            @Override
                public void messageReceived(String message) {
            }
        });
        mTcpClient.run();
        return null;
    }
}

//called when Upload ImageButton is clicked
public void Upload(View view){
        String = Name.getText().toString();
            new connectTask().execute("");
            if (mTcpClient != null) {
                mTcpClient.sendMessage(String);
                ImageButton Upload = (ImageButton)findViewById(R.id.Upload);
                Upload.setEnabled(false);
            }
}
在服务器中,我们有:

    @Override
public void run() {
    super.run();
    running = true;
    try {
        messageListener.messageReceived("Server: Waiting...\n");
        ServerSocket serverSocket = new ServerSocket(SERVERPORT);
        Socket client = serverSocket.accept();
        messageListener.messageReceived("Server: Done!\n");
        try {
            mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            while (running) {
            }
        } catch (Exception e) {
            System.out.println("S: Error");
            e.printStackTrace();
        } finally {
            client.close();
            System.out.println("S: End!");
        }
    } catch (Exception e) {
        System.out.println("S: Erro");
        e.printStackTrace();
    }
}
此“完成!”正确显示在窗口(服务器中):

所以我很有信心,这种联系已经稳定下来了

我不明白为什么它的行为像一个null,因为我把它作为一个全局变量并实例化了它:

public PrintWriter out;
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
if (out!= null && !out.checkError()) { -> Error

关于如何使这个“输出”正常工作,有什么想法吗?提前谢谢

我不知道哪里出了问题,所以这不是一个完整的答案,但我设法用另一种方式来回答,所以这可能会对将来的某个人有所帮助

我不再在android中使用第二个java TCP类,而是在MainActivity中执行以下操作:

   public class connectTask extends AsyncTask<Void,Void,Void> {
    @Override
    protected Void doInBackground(Void... params) {
        try {
            socket = new Socket(ip,port);
            printwriter = new PrintWriter(socket.getOutputStream());
            printwriter.write(mensagem);
            printwriter.flush();
            printwriter.close();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }
}
            connectTask myTask = new connectTask();
            myTask .execute();
不需要太多东西,所以非常简单。通过获取EditText中的文本发送消息,如下所示:

07-07 23:20:00.581 4368-4368/delfino.tchau_papeletas D/AndroidRuntime: Shutting down VM
07-07 23:20:00.585 4368-4368/delfino.tchau_papeletas E/AndroidRuntime: FATAL EXCEPTION: main
Process: delfino.tchau_papeletas, PID: 4368
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
    at android.view.View.performClick(View.java:6259)
    at android.view.View$PerformClick.run(View.java:24732)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6592)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
    at android.view.View.performClick(View.java:6259) 
    at android.view.View$PerformClick.run(View.java:24732) 
    at android.os.Handler.handleCallback(Handler.java:789) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6592) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.PrintWriter.checkError()' on a null object reference
    at delfino.tchau_papeletas.TCPClient.sendMessage(TCPClient.java:84)
    at delfino.tchau_papeletas.MainActivity.Fazer_Upload(MainActivity.java:187)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
    at android.view.View.performClick(View.java:6259) 
    at android.view.View$PerformClick.run(View.java:24732) 
    at android.os.Handler.handleCallback(Handler.java:789) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6592) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 
mensagem = Codigo.getText().toString();
我在调试代码时浪费了很多时间,但有时候重新开始是值得的。我遵循了这个视频教程,我显然推荐,因为它有我需要的一切


再次感谢您的帮助。

只有在没有异常的情况下,您才初始化了它。因此,有一个异常,您在空的catch块中愉快地忽略了它。空的自旋循环是用来做什么的?这些循环不是空的,我刚刚删除了里面的内容,这样代码就更清晰了,只有我认为至关重要的信息。我很抱歉,在你看来,我只是轻率地忽略了例外,我只是没有意识到问题可能存在,我无法找到它存在的原因或如何解决它。。。幸运的是我设法用其他方法做了这件事。我已经发布了一个答案,这不是一个真正的答案,而是一个适当的解决方案,我的问题。谢谢你的帮助!您发布的代码忽略异常。对此没有“意见”。这就解释了空指针异常。