2014-01-06 166 views
0

我有一個關於Android套接字客戶端應用程序的問題。我想用它來測試與套接字服務器軟件的連接。但是每當我按下任何一個按鈕時,應用程序崩潰。有誰知道問題出在我的應用程序中?Android套接字客戶端問題

package ab.2develop.Sockets; 

    import java.io.IOException; 
    import java.net.InetAddress; 
    import java.net.Socket; 
    import java.net.UnknownHostException; 

    import android.app.Activity; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.os.Message; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.EditText; 
    import android.widget.TextView; 
    import android.widget.ToggleButton; 

    import android.widget.Button; 
    import android.widget.ProgressBar; 
    import android.widget.Toast; 
    import android.os.SystemClock; 

    public class SocketsActivity extends Activity { 

     static final String NICKNAME = "abc"; 
     Button btn_start; 
     public static ProgressBar progressBar;//id of progressbar 
     public static ProgressBar lamp1;  //id of progressbar 
     public TextView txt_percentage; 

     //---socket--- 
     InetAddress serverAddress; 
     Socket socket; 

     //---all the Views---  
     static TextView txtMessagesReceived; 
     static TextView numBytesReceived; 
     EditText txtMessage; 


     //---thread for communicating on the socket--- 
     CommsThread commsThread; 

     //---used for updating the UI on the main activity--- 
     static Handler UIupdater = new Handler() { 
      public int value1; 
      public int value2; 

      @Override 
      public void handleMessage(Message msg) { 

       int numOfBytesReceived = msg.arg1; 
       byte[] buffer = (byte[]) msg.obj; 

       //---convert the entire byte array to string--- 
       String strReceived = new String(buffer); 

       //---extract only the actual string received--- 
       strReceived = strReceived.substring(
         0, numOfBytesReceived); 
       String strleft = strReceived.substring(0,3); 

      // value1++; 

       if (strleft.equals("111")) 
       { 
        value1++; 
        progressBar.setProgress(value1); 
       } 
       if (strleft.equals("110")) 
       { 
        value1--; 
        progressBar.setProgress(value1); 
       } 

       if (strleft.equals("221")) 
       { 
        value2++; 
        lamp1.setProgress(value2); 
       } 
       if (strleft.equals("220")) 
       { 
        value2--; 
        lamp1.setProgress(value2); 
       } 


       //---display the text received on the TextView--- 
       txtMessagesReceived.setText(""); 
       txtMessagesReceived.setText(
        // txtMessagesReceived.getText().toString() + 
        // strReceived + numOfBytesReceived + value1); 
         txtMessagesReceived.getText().toString() + strleft + value1); 



      // numBytesReceived.setText(
      //   numBytesReceived.getText()); 
      } 
     }; 


     private class CreateCommThreadTask extends AsyncTask 
     <Void, Integer, Void> { 
      @Override 
      protected Void doInBackground(Void... params) {    
       try { 
        //---create a socket--- 
        serverAddress = 
        //InetAddress.getByName("192.168.1.105"); 
        //socket = new Socket(serverAddress, 500); 
        InetAddress.getByName("192.168.0.200"); 
        socket = new Socket(serverAddress, 5000); 
        commsThread = new CommsThread(socket); 
        commsThread.start();     
        //---sign in for the user; sends the nick name--- 
        sendToServer(NICKNAME); 
       } catch (UnknownHostException e) { 
        Log.d("Sockets", e.getLocalizedMessage()); 
       } catch (IOException e) { 
        Log.d("Sockets", e.getLocalizedMessage()); 
       } 
       return null; 
      } 
     } 

     private class WriteToServerTask extends AsyncTask 
     <byte[], Void, Void> { 
      protected Void doInBackground(byte[]...data) { 
       commsThread.write(data[0]); 
       return null; 
      } 
     } 

     private class CloseSocketTask extends AsyncTask 
     <Void, Void, Void> {   
      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        Log.d("Sockets", e.getLocalizedMessage());     
       } 
       return null; 
      } 
     } 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      //---get the views--- 
      txtMessagesReceived = (TextView) 
        findViewById(R.id.txtMessagesReceived); 
      btn_start = (Button) findViewById(R.id.btn_start); 
      progressBar = (ProgressBar) findViewById(R.id.progress); 
      lamp1 =  (ProgressBar) findViewById(R.id.lamp1); 
      txt_percentage= (TextView) findViewById(R.id.txt_percentage); 
      btn_start.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        btn_start.setEnabled(false); 

       } 
      }); 
     } 

     public void onClickSend(View view) { 
      //---send the message to the server--- 
      sendToServer(txtMessage.getText().toString()); 
     } 

     private void sendToServer(String message) { 
      byte[] theByteArray = 
        message.getBytes(); 
      new WriteToServerTask().execute(theByteArray);  
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
      new CreateCommThreadTask().execute(); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      new CloseSocketTask().execute(); 
     } 


     public void onClickLight11(View view) { 
      //---send the message to the server--- 
      String str = "101".toString(); 
      sendToServer(str); 
      //sendToServer(txtMessage.getText().toString()); 
     } 

     public void onClickLight21(View view) { 
      //---send the message to the server--- 
      String str = "201".toString(); 
      sendToServer(str); 
      //sendToServer(txtMessage.getText().toString()); 
     } 

     public void onClickLight31(View view) { 
      //---send the message to the server--- 
      String str = "301".toString(); 
      sendToServer(str); 
      //sendToServer(txtMessage.getText().toString()); 
     } 

     public void onClickLight00(View view) { 
      //---send the message to the server--- 
      String str = "000".toString(); 
      sendToServer(str); 
      //sendToServer(txtMessage.getText().toString()); 
     } 

     public void onClickLight55(View view) { 
      //---send the message to the server--- 
      String str = "555".toString(); 
      sendToServer(str); 
      //sendToServer(txtMessage.getText().toString()); 
     } 

     public void onToggleClicked(View view) {  
      // Is the toggle on?  
      boolean on = ((ToggleButton) view).isChecked(); 

      if (on) {   
       String str = "301".toString(); 
       sendToServer(str);  
       } else {   
        String str = "000".toString(); 
        sendToServer(str);  
        } 
      } 



     } 











    package ab.2develop.Sockets; 

    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.net.Socket; 
    import android.util.Log; 


    public class CommsThread extends Thread { 
     private final Socket socket; 
     private final InputStream inputStream; 
     private final OutputStream outputStream; 

     public CommsThread(Socket sock) { 
      socket = sock; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 
      try { 
       //---creates the inputstream and outputstream objects 
       // for reading and writing through the sockets--- 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { 
       Log.d("SocketChat", e.getLocalizedMessage()); 
      } 
      inputStream = tmpIn; 
      outputStream = tmpOut; 
     } 

     public void run() { 
      //---buffer store for the stream--- 
      byte[] buffer = new byte[1024]; 

      //---bytes returned from read()--- 
      int bytes; 

      //---keep listening to the InputStream until an 
      // exception occurs--- 
      while (true) { 
       try { 
        //---read from the inputStream--- 
        bytes = inputStream.read(buffer); 

        //---update the main activity UI--- 
        SocketsActivity.UIupdater.obtainMessage(
         0,bytes, -1, buffer).sendToTarget(); 
       } catch (IOException e) { 
        break; 
       } 
      } 
     } 

     //---call this from the main activity to 
     // send data to the remote device--- 
     public void write(byte[] bytes) { 
      try { 
       outputStream.write(bytes); 
      } catch (IOException e) { } 
     } 

     //---call this from the main activity to 
     // shutdown the connection--- 
     public void cancel() { 
      try { 
       socket.close(); 
      } catch (IOException e) { } 
     } 




    } 





<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
<Button 
     android:id="@+id/btn_start" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/progress" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="40dp" 
     android:minWidth="120dp" 
     android:text="@string/start_btn" /> 

<TextView 
    android:id="@+id/txtMessagesReceived" 
    android:layout_width="fill_parent" 
    android:layout_height="80dp" 
    android:textSize="30dip" 
    android:text="@string/msg_received" 
    android:scrollbars = "vertical" /> 

<TextView 
     android:id="@+id/txt_percentage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/progress" 
     android:text="downloading 0%" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 


<TextView 
    android:id="@+id/numBytesReceived" 
    android:layout_width="fill_parent" 
    android:layout_height="80dp" 
    android:textSize="30dip" 
    android:text="@string/num_msg_received" 
    android:scrollbars = "vertical" /> 

<Button 
     android:id="@+id/Light11" 
     android:textSize="30dip" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickLight11" 
     android:text="@string/button_send_Light11" /> 

    <Button 
     android:id="@+id/Light21" 
     android:textSize="30dip" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickLight21" 
     android:text="@string/button_send_Light21" /> 

    <Button 
     android:id="@+id/Light31" 
     android:textSize="30dip" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickLight31" 
     android:text="@string/button_send_Light31" /> 

    <Button 
     android:id="@+id/Light00" 
     android:textSize="30dip" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickLight00" 
     android:text="@string/button_send_Light00" />  

    <Button 
     android:id="@+id/Light55" 
     android:textSize="30dip" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickLight55" 
     android:text="@string/button_send_Light55" /> 

    <ToggleButton  
     android:id="@+id/togglebutton"  
     android:textSize="30dip" 
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"  
     android:textOn="Light1 on"  
     android:textOff="Light1 off"  
     android:onClick="onToggleClicked"/> 

    <ProgressBar 
     android:id="@+id/progress" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textView1" 
     android:layout_marginTop="34dp" /> 

    <ProgressBar 
     android:id="@+id/lamp1" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 

     android:layout_marginTop="34dp" /> 

</LinearLayout> 

enter image description here

+0

你可以發佈你的LogCat輸出嗎?這將幫助我們找到問題。 –

+0

已更新。請檢查我 –

+0

SocketActivity的第131行是什麼? –

回答

0

檢查堆棧跟蹤。唯一的例外是由

commsThread.write(data[0]); 

這清楚地表明,無論是commsThreaddata爲null。