2017-10-11 112 views
1

这是我在android上的第一个应用程序,我试图编写一个TCP客户端。发送TCP数据包时程序崩溃

到目前为止,我有一个Python的TCP服务器,我用python的TCP客户端测试它,它工作正常。

我从here获取了TCP客户端示例。

当我启动应用程序时,我可以在wireshark上看到握手,以便建立连接。

现在,问题是发送消息。当我把函数调用

if (mTcpClient != null) 
{ 
    mTcpClient.sendMessage("testing"); 
} 

在主要活动:

public void ChangeButtonState(View view) 
{ 
    boolean state = ((ToggleButton) view).isChecked(); 
    if (state) 
    { 

     if (mTcpClient != null) { 
      mTcpClient.sendMessage("testing"); 
     } 


     textView.setText("button is on. sent Tcp message. "); 
     textView.setVisibility(View.VISIBLE); 
    } else { 
     textView.setText("button is off"); 
    } 
} 

代码崩溃在TcpClient的类行mBufferOut.println(message);

但是,如果我在TcpClient类中的行mBufferOut = new PrintWriter(socket.getOutputStream());之后立即调用该函数,则客户端将传输该消息,服务器接收该消息并将其发送回客户端。

所以我的问题是为什么代码崩溃? mTcpClient成员不为空。

+0

您是从主线程运行此代码?请分享堆栈跟踪 –

回答

0

您应该在后台线程中发送网络请求。使用AsyncTaskThread

new Thread(new Runnable(){ 
    public void run(){ 
     mTcpClient.sendMessage("test"); 
    } 
}).start(); 
+0

谢谢!解决了这个问题。为什么它应该在线程上呢? – user1673206

+0

很高兴我能帮到你。如果您在前台线程中发送网络请求,应用程序将冻结,直到请求完成。所以android SDK已经迫使开发人员在后台线程中执行网络调用。 –