套接字TCP android java到java->;客户端在out.println(消息)上发送错误消息
我已经在我的PC上实现了一个Java TCP服务器,它将接受运行客户端的Android设备发送的传入消息,这也是实现的。服务器只需要从Android设备接收此消息并在其窗口上显示即可。我能够成功地连接(我后来解释了为什么我相信),但我无法发送消息。下面是代码中出现错误的部分:套接字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
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块中愉快地忽略了它。空的自旋循环是用来做什么的?这些循环不是空的,我刚刚删除了里面的内容,这样代码就更清晰了,只有我认为至关重要的信息。我很抱歉,在你看来,我只是轻率地忽略了例外,我只是没有意识到问题可能存在,我无法找到它存在的原因或如何解决它。。。幸运的是我设法用其他方法做了这件事。我已经发布了一个答案,这不是一个真正的答案,而是一个适当的解决方案,我的问题。谢谢你的帮助!您发布的代码忽略异常。对此没有“意见”。这就解释了空指针异常。