Android Socket向WPF应用程序发送数据

时间:2014-05-20 21:12:44

标签: java android wpf sockets tcp

所以我有一个注册Android应用程序,在主活动中创建一个套接字连接创建opensocket()。一切都在第一次提交时完美运行,调试器输出看起来很棒,它从我的WPF应用程序发回/接收数据。现在进入感谢活动,onclick导致我的主要活动。现在,当我点击提交,它工作正常,但显示它击中我的套接字方法两次(只在我的WPF应用程序上插入一次记录),等等我提交的次数。我意识到我没有正确关闭或重新使用我的套接字连接?!我尝试了几件事,但似乎无法重复使用相同的opensocket实例,或者只是关闭并重新启动重新加载。我对Android和套接字都很陌生,非常感谢任何帮助!

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

        openSocket();

        sett.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                launchSettings();
        }

        });
        mainLogo.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                RefreshMain();
        }

        });




        btn_register.setOnClickListener(new OnClickListener() {




            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                tv_errors.setText("");
                errorMsg = "";
                nameCheck(et_lName.getText().toString(),et_fName.getText().toString());
                emailCheck(et_email.getText().toString());
                partnerCheck();
                mobileCheck(et_mobile.getText().toString());
                if (SocketHandler.SocketConnected){
                    if(errorMsg == ""){
                        //tv_errors.setText("");
                        if(checkForSD() == true){
                        sendRegistrantInfo(et_fName.getText() + "," + et_lName.getText() + "," + et_email.getText() + "," + et_mobile.getText() + "," + et_partEmail.getText() + "," + cb_terms1.isChecked() + "," + cb_terms2.isChecked() );
                        }
                        else{

                            tv_errors.setText("**Please insert an SD Card.");

                        }
                    }
                    else{


                        //tv_errors.setText(errorMsg);

                    }
                }
                else
                {
                    connectionStatus.setText("Connection Error.");

                    tv_errors.setText("**Connection lost, please try again.");
                    //openSocket();

                }


            }
        });



    }
    public void RefreshMain()
    {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);

    }
    public void launchLogin()
    {
        Intent intent = new Intent(this, LoginActivity.class);
        startActivity(intent);


    }//end launchLogin
    public void launchSettings()
    {
        Intent intent = new Intent(this, SettingsActivity.class);
        startActivity(intent);


    }//end launchSettings

    public void settingsCheck()
    {
        SharedPreferences settings = getSharedPreferences("prefs",MODE_PRIVATE);
        String currentIP = settings.getString("IPSetting", "");
        String currentPort = settings.getString("PORTSetting", "");
        currentMem = settings.getString("SDSize", "");
        if (currentIP == "" || currentPort == ""){
            Intent myIntent = new Intent(this,SettingsActivity.class);
            startActivity(myIntent);

        }

    }//end settingsCheck()



    public void launchRingDialog(String id) {

        final String idYo = id;       
        final ProgressDialog ringProgressDialog = ProgressDialog.show(MainActivity.this, "Formatting SD Card","Formatting SD Card, please wait this could take several minutes...", true);

                new Thread(new Runnable() {

                    @Override

                    public void run() {

                        try {

                            fileToSD(idYo);
                            Thread.sleep(10000);

                        } catch (Exception e) {

                       }

                        ringProgressDialog.dismiss();

                    }

                }).start();

            }
    public boolean checkForSD()
    {
        String root = "/storage/removable/sdcard1/";
        double memInGigs = round(sizeMatters(root),2);

        if(memInGigs >0){
        return true;
        }
        else
        {

        return false;
        }
    }



    private double sizeMatters(String path)
    {
        StatFs stat = new StatFs(path);
        double availSize = (double)stat.getAvailableBlocks() * (double)stat.getBlockSize();

        double ingigs = availSize/ 1073741824;
        return ingigs;

    }//end sizeMatters()

    private void sendRegistrantInfo(String reg){ 
        _sh.sendMessage(reg);
    } 

    private void openSocket(){

        _sh = new SocketHandler();
        _sh.setSocketHandlerListener(this);
        SharedPreferences settings = getSharedPreferences("prefs",MODE_PRIVATE);
        String currentIP = settings.getString("IPSetting", "");
        String currentPort = settings.getString("PORTSetting", "");
        _sh.open(currentIP, currentPort);
    }

    @Override  
    protected void onPause() {  
        super.onPause();  

    }  
        @Override  
    protected void onResume() {  
        super.onResume();  

    }

    @Override
    public void onSocketConnected() {
        Log.v(TAG, "onSocketConnected");
       connectionStatus.setText("CONNECTED");

    }

    @Override
    public void onSocketData(String msg) {

        Log.v(TAG, "onSocketData - " + msg );
        int usrID = Integer.parseInt(msg.trim());
        if (msg != null & usrID > 0){
            launchRingDialog(msg);

            Intent intent = new Intent(this, ThanksActivity.class);
            startActivity(intent);
        }
        else if(msg.trim().equals("-2") == true)
        {
            tv_errors.setText("**This email has already been registered for this event, please click Already Registered button to sign in.");
        }
        else{

        tv_errors.setText("**Error, Please try submitting again.");
        errorMsg = "-1";
        }


    }

    @Override
    public void onSocketDisconnected() {
        Log.v(TAG, "onSocketDisconnected");
        connectionStatus.setText("DISCONNECTED");

    }




    public class SocketHandler {

        Socket sc;
        public static boolean SocketConnected = false;
        private static ClientThread cThread;

        public String prefsFile = "prefs";
        public String port = "8888";
        public String ip = "192.168.1.4";


        private String TAG = "SocketHandler";
        protected SocketHandlerListener socketHandlerListener;

        public interface SocketHandlerListener{
            public void onSocketConnected();
            public void onSocketData(String msg);
            public void onSocketDisconnected();
        }

        public SocketHandler(){

        }

        public void setSocketHandlerListener(SocketHandlerListener shl){
            socketHandlerListener = shl;
        }

        public void open(String ip, String port){
            this.ip = ip; 
            this.port = port;
            cThread = new ClientThread();
            try{
                cThread.start();    
            }catch (Exception ex){
                Log.v(TAG, "Error connecting to socket");

            }
        }

        public void close(){
            if (cThread != null){
                if (cThread.socket != null){
                    try {
                        cThread.socket.close();
                    } catch (Exception e) {
                        Log.v(TAG, "Error closing socket");
                    }
                    cThread.socket = null;  
                }
            }
        }


        public void sendMessage(String msg){
            cThread.sendMessage(msg);
        }

        public void messageRecieved(String msg){
            dispatchSocketData(msg);
        }

        private void dispatchSocketConnected(){
            if (socketHandlerListener != null){
                socketHandlerListener.onSocketConnected();
            }
        }

        private void dispatchSocketDisconnected(){
            if (socketHandlerListener != null){
                socketHandlerListener.onSocketDisconnected();
            }
        }

        private void dispatchSocketData(String msg){
            if (socketHandlerListener != null){
                socketHandlerListener.onSocketData(msg);
            }
        }

        public  class ClientThread extends Thread {
            public  Socket socket; 

            public void run() {
                try {



                    InetAddress serverAddr = InetAddress.getByName(ip);
                    Log.v(TAG, "C: Connecting..." + ip + ":" + port);
                    socket = new Socket(serverAddr, Integer.parseInt(port));
                    socket.setSoTimeout(0);
                    socket.setKeepAlive(true);
                    SocketConnected = true;
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            dispatchSocketConnected();

                        }
                    });

                    // BLOCKING THE THREAD
                    while (SocketConnected) {
                       InputStream in = socket.getInputStream();

                        byte[] buffer = new byte[4096];
                        int line = in.read(buffer, 0, 4096);

                        while (line != -1) {

                            byte[] tempdata = new byte[line];
                            System.arraycopy(buffer, 0, tempdata, 0, line);
                           final String data = new String(tempdata);

                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    messageRecieved(data);
                                    SocketConnected = false;
                                }
                            });
                            line = in.read(buffer, 0, 4096);
                        }

                       // break;

                    }
                    socket.close();

                    Log.v("Socket", "C: Closed.");
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            dispatchSocketDisconnected();

                        }
                    });
                    SocketConnected = false;
                } catch (Exception e) {
                    Log.v("Socket", "C: Error", e);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            dispatchSocketDisconnected();

                        }
                    });
                    SocketConnected = false; 
                }
            }

            Handler handler = new Handler();


            public  void sendMessage(String msg){

                if (socket != null){
                    if (socket.isConnected()){
                        PrintWriter out;
                        try {
                            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), false);
                            out.print(msg);
                            out.flush();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }


            }
        }
    }

0 个答案:

没有答案