2012-12-30 152 views
0

我对android和java编程很新颖。我正在编写一个服务器客户端连接。我的电脑应该是服务器,我的android智能手机应该是客户端。服务器很好。我可以从客户端向服务器发送消息,但是我无法从服务器向客户端发送消息。当我这样做时,客户端会粉碎并关闭自己。我真的希望任何人都能帮助我解决我的大问题。Android客户端没有收到消息

这里是我的活动:

package com.example.sercerclient2zweidreidrei; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 


public class MyActivity extends Activity { 

Button btn; 
EditText textOut; 
TextView textIn; 
TextView problems; 
Button send; 
private TCPClient myTcpClient; 

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

    final EditText editText = (EditText) findViewById(R.id.editText); 
    final TextView textIn = (TextView) findViewById(R.id.textin); 
    Button send = (Button)findViewById(R.id.send_button); 

    // connect to the server 
    new connectTask().execute(""); 

    send.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      String message = editText.getText().toString(); 

      //sends the message to the server 
      if (myTcpClient != null) { 
       myTcpClient.sendMessage(message); 
      } 
     } 
    }); 
} 

public class connectTask extends AsyncTask<String,String,TCPClient> { 

    @Override 
    protected TCPClient doInBackground(String... message) { 

     //we create a TCPClient object and 
     myTcpClient = new TCPClient(new TCPClient.OnMessageReceived() { 

      @Override 
      //here the messageReceived method is implemented 
      public void messageReceived(String message) { 
       //this method calls the onProgressUpdate 
       publishProgress(message); 
      } 
     }); 
     myTcpClient.run(); 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 

     //in the arrayList we don't add the message received from server 
     //here i try to write the incomming message into a textVie 
     textIn.setText(values[0]); 
    } 
} 
} 

这里是我的TcpClient类:

package com.example.sercerclient2zweidreidrei; 

import android.util.Log; 
import java.io.*; 
import java.net.InetAddress; 
import java.net.Socket; 


public class TCPClient { 

private String serverMessage; 
public static final String SERVERIP = "192.168.2.107"; //your computer IP address 
public static final int SERVERPORT = 4444; 
private OnMessageReceived mMessageListener = null; 
private boolean mRun = false; 

PrintWriter out; 
BufferedReader in; 

/** 
* constructor of the class. OnMessageReceived listens for the messages 
* received from server 
*/ 
public TCPClient(OnMessageReceived listener) { 
    mMessageListener = listener; 
} 

/** 
* Sends the message entered by client to the server 
* @param message text entered by client 
*/ 
public void sendMessage(String message){ 
    if (out != null && !out.checkError()) { 
     out.println(message); 
     out.flush(); 
    } 
} 

public void stopClient() { 
    mRun = false; 
} 

public void run() { 
    mRun = true; 

    try { 
     // here you must put your computer's IP address. 
     InetAddress serverAddr = InetAddress.getByName(SERVERIP); 

     Log.e("TCP Client", "C: Connecting..."); 

     //create a socket to make the connection with the server 
     Socket socket = new Socket(serverAddr, SERVERPORT); 

     try { 
      //send the message to the server 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 

      Log.e("TCP Client", "C: Sent."); 
      Log.e("TCP Client", "C:Done."); 

      //receive the message which the server sends back 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      //in this while the client listens for the messages send by the server 
      while (mRun) { 
       serverMessage = in.readLine(); 

       if (serverMessage != null && mMessageListener != null) { 
        //call the method messageReceived from MyActivity class 
        mMessageListener.messageReceived(serverMessage); 
       } 
       serverMessage = null; 
      } 

      Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'"); 

     } catch (Exception e) { 

      Log.e("TCP", "S: Error", e); 

     } finally { 
      //the socket must be closed. It is not possible to reconnect to this socket 
      //after it is closed, which means a new socket instance has to be created. 
      socket.close(); 
     } 
    } catch (Exception e) { 
     Log.e("TCP", "C:Error", e); 
    } 
} 

/* 
* Declare the interface. The method messageReceived(String message must be 
* implemented in the MyActivity class at on asynckTask doInBackground 
*/ 
public interface OnMessageReceived { 
    public void messageReceived(String message); 
} 
} 

最后在这里你可以看到我的main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MyActivity" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="@string/Textausgabe" /> 

<EditText 
    android:id="@+id/editText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/textView1" 
    android:layout_marginTop="34dp" 
    android:ems="10" > 

    <requestFocus /> 
</EditText> 

<Button 
    android:id="@+id/send_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignRight="@+id/textView1" 
    android:layout_below="@+id/editText" 
    android:layout_marginTop="26dp" 
    android:text="@string/Senden" /> 

<TextView 
    android:id="@+id/textin" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:text="@string/EinkommenderText" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

这里是我的logcat :

12-30 16:36:37.340:I/dalvikvm(548):主题ID = 3:反应以信号3

12-30 16:36:37.560:I/dalvikvm(548):写栈跟踪为 '/data/anr/traces.txt'

12-30 16:36:37.740:I/dalvikvm(548):主题ID = 3:反应以信号3

12-30 16点36: 37.790:I/dalvikvm(548):将堆栈跟踪写入'/data/anr/traces.txt'

12-30 16:36:38.350:D/gralloc_goldfish(548):未检测到GPU仿真的仿真器。

12-30 16:36:38.630:I/dalvikvm(548):主题ID = 3:反应以信号3

12-30 16:36:38.650:I/dalvikvm(548):写堆栈迹线到 '/data/anr/traces.txt'

12-30 16:36:39.721:E/TCP客户端(548):C:连接...

12-30 16时36: 39.981:E/TCP客户端(548):C:发送。 E/TCP客户端(548):C:完成。

12-30 16:38:59.034:d/AndroidRuntime(548):关闭VM

12-30 16:38:59.034:W/dalvikvm(548):线程ID = 1:螺纹与离开未捕获的异常 (组= 0x409c01f8)

12-30 16:38:59.051:E/AndroidRuntime(548):致命异常:主

12-30 16:38:59.051:E/AndroidRuntime(548 ):java.lang.NullPointerException

12-30 16:38:59.051:E/AndroidRuntime(548):at com.example.sercerclient2zweidreidrei.MyActivity $ connectTask.onProgressUpdate(MyActivity.java:72)

12-30 16:38:59.051:E/AndroidRuntime(548):在 com.example.sercerclient2zweidreidrei.MyActivity $ connectTask .onProgressUpdate(MyActivity.java:1)

12-30 16:38:59。051:E/AndroidRuntime(548):在 android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:618)

12-30 16:38:59.051:E/AndroidRuntime(548):在 机器人.os.Handler.dispatchMessage(Handler.java:99)

12-30 16:38:59.051:E/AndroidRuntime(548):在android.os.Looper.loop(Looper.java:137)

12-30 16:38:59.051:E/AndroidRuntime(548):在 android.app.ActivityThread.main(ActivityThread.java:4424)

12-30 16:38:59.051:E/AndroidRuntime(548):在 java.lang.reflect.Method.invokeNative(本机方法)

12-30 16:38:59.051:E/AndroidRuntime(548):在 java.lang.reflect.Method中。调用(Method.java:511)

12-30 16:38:59.051:E/AndroidRuntime(548):在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)

12-30 16:38:59.051:E/AndroidRuntime(548):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

12-30 16:38:59.051:E/AndroidRuntime(548):在dalvik.system.NativeStart.main(母语 方法)

12-30 16:38:59.752:I/dalvikvm(548):主题ID = 3:反应以信号3

12-30 16:38:59.900:I/dalvikvm(548):写堆栈跟踪到 '/data/anr/traces.txt'

希望你可以找到我的错误。

+0

您可能想考虑使用GCM将您的消息发送到您的设备。同时添加一些日志代码并发布结果可以帮助人们回答你。 – selsine

+0

发布您的logcat – CocoNess

+0

我添加了我的LogCat,并希望有人可以在那里找到我的错误。 – Lukas5060

回答

0

您在活动中使用AsyncTask任务来建立TCP连接。因此,一旦建立连接,就会发送消息,并且您的AsyncTask任务完成并关闭TCP连接。

您应该使用独立服务而不是活动来保持连接处于打开状态。

+0

[链接](http://myandroidsolutions.blogspot.de/2012/07/android-tcp-connection-tutorial.html)在那里我发现它以类似的方式,它的工作。但在我的应用程序,我不会有这个列表视图只是一个TextView。是不是有可能在TextView中显示输入消息? – Lukas5060

+0

当然有几种可能性。你必须保持你已建立的连接。你是否想保持联系?在上面引用的示例中,连接保持不变。 – gezdy

+0

好的。这不是我想听到的答案,但确定。如果这是唯一的方法。当我将手机切换到水平模式时,我的连接也会崩溃。使用AsyncTask可能导致这个问题吗? – Lukas5060

相关问题