Android Socket客户端问题

时间:2014-01-06 03:47:36

标签: java android xml sockets

我对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

1 个答案:

答案 0 :(得分:0)

检查堆栈跟踪。

引发了异常
commsThread.write(data[0]);

这清楚地表明commsThreaddata为空。