Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字客户端+;螺纹+;安卓&x2B;连接状态';s_Java_Android_Sockets_Client - Fatal编程技术网

Java 套接字客户端+;螺纹+;安卓&x2B;连接状态';s

Java 套接字客户端+;螺纹+;安卓&x2B;连接状态';s,java,android,sockets,client,Java,Android,Sockets,Client,我对java和Android开发都非常陌生,我正在设计一个Android客户端,用于向服务器发送消息,并从服务器接收消息。它只执行一些功能,首先它将查询服务器的初始状态,然后使用该状态更新按钮,并使用充电符号表示充电器是否正在充电。我已经完成了所有的通信代码,线程似乎能够很好地发送和接收消息,但是线程之外的变量没有被更新,如果我关闭服务器连接,客户端将保持连接打开,就好像服务器仍然在那里一样。谁能给我一些建议,来解决我的问题 package charger.app; import java.i

我对java和Android开发都非常陌生,我正在设计一个Android客户端,用于向服务器发送消息,并从服务器接收消息。它只执行一些功能,首先它将查询服务器的初始状态,然后使用该状态更新按钮,并使用充电符号表示充电器是否正在充电。我已经完成了所有的通信代码,线程似乎能够很好地发送和接收消息,但是线程之外的变量没有被更新,如果我关闭服务器连接,客户端将保持连接打开,就好像服务器仍然在那里一样。谁能给我一些建议,来解决我的问题

package charger.app;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;


public class ChargeTabActivity extends Activity {

String serverIp = "192.168.6.120"; //server Ip address  
private static String preqon = "control:Charger:1\r\n"; //sets connection to turn charger on
private static String preqoff = "control:Charger:0\r\n";    //Turn charger off
public boolean connected = false; //connection 

//set up buttons
private ImageButton chargeOnOff;
private ImageButton connectButton;

//Set it so that Client Functions can be accessed from main program
ClientFunctions functions = new ClientFunctions();



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //initialize UI
    setContentView(R.layout.main);

    //declare buttons for listeners, and display changes        
    connectButton = (ImageButton)findViewById(R.id.connectButton);       
        connectButton.setOnClickListener(connectButtonListener);    
    chargeOnOff = (ImageButton)findViewById(R.id.chargeOnOff);  
        chargeOnOff.setOnClickListener(chargeOnOffListener);
    Button chargeStatus = (Button)findViewById(R.id.chargeStatus);



    ////set up strict mode off/////
        StrictMode.ThreadPolicy policy = new StrictMode.
                ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);


}



/*Listens to see if the connect button is pressed, if it is connected it will 
 * display connected, else it will try and connect*/
private OnClickListener connectButtonListener = new OnClickListener() 
{
    public void onClick(View v)
    {
        if (connected) 
        {
            toast("I am connected");
        }
        else 
        {
            toast("I am not connected");
        }
    }
};


/*Listens to see if the Charge on Off Button is pressed, if it is charging it will 
 * send a request to charge, else it will send a request to stop the charge*/
private OnClickListener chargeOnOffListener = new OnClickListener() 
{
    public void onClick(View v)
    { 
        //ask server
        try {
            functions.updateStatus();  //updates the charger status
        } catch (IOException e) {
            Log.e("Client","Trouble querying",e);
            e.printStackTrace();
        }

        //send message to turn server on or off
        if (functions.chargeStatNumber != 0) 
        {
            try {
                functions.sendMessage(preqoff);
                chargeOnOff.setImageResource(R.drawable.charge_on);
                toast("Turning Charger off");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }//end if


        else 
        {
            try {
                functions.sendMessage(preqon);
                chargeOnOff.setImageResource(R.drawable.charge_off);
                toast("Turning Charger on");

            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        } //end else

        Log.d("ClientActivity", "Charge Button hit" );


        //ask server about its status
        try {
            functions.updateStatus();  //updates the charger status
        } catch (IOException e) {
            Log.e("Client","Trouble querying",e);
            e.printStackTrace();
        }

    }
};


/////When Application Starts
@Override
public void onStart() 
{
    super.onStart();

    Thread cThread = new Thread(new serverThread()); //Starts the thread that initiates communications
    cThread.start();
};

////////On Pause//////This is when a user makes another app, the center point of attention 
@Override
public void onPause() {
    super.onPause();
    functions.closeConnection();

};

//////On Resume/////This is used for when an app exits, and then the user brings it back
@Override
public void onResume() {
    super.onResume();


};

//////On Destroy//////////
@Override
public void onDestroy() {
    super.onDestroy();
    functions.closeConnection();

};



//toast messages
public void toast(String toastMessage) 
{
    Toast.makeText(DelphiChargeTabActivity.this, toastMessage,
            Toast.LENGTH_LONG).show();
};



//Thread to run and receive network connections

public class serverThread implements Runnable 
{
    public boolean connected = false; //connection
    public void run() //runs the thread
    {

        try 
        {
            functions.connectToServer(serverIp); //connects to server
            connected = true;

            while (connected) 
            {
                try 
                {
                    connectButton.setImageResource(R.drawable.blue_car);
                    functions.getStreams(); //establish stream connections
                    functions. updateStatus(); //updates the status of the server
                    //checkChangeChargeButton(); //sets initial state for charge button



                    try
                    {
                        Thread.sleep(2500);
                    }
                          catch ( InterruptedException interruptedException ) 
                          {
                             functions.displayMessage( "\nThread exception" );
                          } // end catch

                }
                    catch (IOException e) 
                    {
                        Log.e("Client","Trouble Getting Streams",e);

                    }



            }//end while
        }//end try
            catch (Exception e)
            {
                Log.e("Client", "Error Connecting", e);
                connected = false;
                connectButton.setImageResource(R.drawable.red_car);

            }
    }; //end run
}; //end serverThread

public void checkChangeChargeButton() 
{

    if (functions.chargeStatNumber != 0) 
    {
        chargeOnOff.setImageResource(R.drawable.charge_on);
    }
    else 
    {
        chargeOnOff.setImageResource(R.drawable.charge_off);
    }

};



} //This is the Activity close bracket
这是我的函数方法的代码

    package charger.app;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.Socket;

import android.util.Log;


public class ClientFunctions
{

private String message;
private String server;
public Socket sock;
private PrintWriter writer;
private DataInputStream inStream;
public Boolean connected;
private String encode = "UTF8";
public byte[] chargerstat;
public int  chargeStatNumber; //Used to set the array byte 15 to an int


//inquires server for status of charge
public void updateStatus() throws IOException 
{
    //Prompt user for server command
    System.out.println("Sending request for Charger status data.");
        String serverMessage = "meas:Charger?\r\n";

    // send the message
        sendMessage("meas:Charger?\r\n");
        System.out.println();
        displayMessage(serverMessage + "sent");

    // now receive the message
    receiveMessage();
        displayMessage("Receive complete");


};


public void connectToServer(String serverIp) throws IOException  //Server IP is sent in main    app as String "serverIp"
{
    //set server IP

    //display logcat trying to connect
    displayMessage("\nTrying to Connect");
    //Start Socket Connection
    sock = new Socket( InetAddress.getByName( serverIp ), 18088);
    //Display connected
    displayMessage( "\nConnected to: " + 
             sock.getInetAddress().getHostName() );



};

public void getStreams() throws IOException 
{
    //Set up PrintWriter
    writer = new PrintWriter(new BufferedWriter(new            OutputStreamWriter(sock.getOutputStream())),true);
    writer.flush();
    //Set Up I
    inStream = new DataInputStream(sock.getInputStream());
    //display Message Got I/O
    displayMessage("\nGot IO Streams");

};

public void sendMessage(final String serverMessage) throws UnsupportedEncodingException 
{


    //set variable for message
    message = serverMessage;
    //sends message
    writer.printf("%s", message);
    writer.flush();
    //display message sent
    displayMessage("\nsent" /*+ serverMessage*/);




};

public static int getInt(byte[] array, int offset) 
  {
    return
      ((array[offset+3]   & 0xff) << 24) |
      ((array[offset+2] & 0xff) << 16) |
      ((array[offset+1] & 0xff) << 8) |
       (array[offset] & 0xff);
  }


public void receiveMessage() throws IOException 
{
    {
        int c=0;
        int i;          
        int seqcountval;

        chargerstat = new byte[96];
        i=0;
        while(i < 96)
        {
            try
            {
                c = inStream.read();
                chargerstat[i] = (byte)c;
            }
            catch ( IOException ioException ) 
            {
                ioException.printStackTrace();
            } // end catch
// uncomment this to see each byte          
            //displayMessage(":" + i + " " + chargerstat[i]);
            i++;
        }

        seqcountval = getInt(chargerstat, 76);
        displayMessage("SeqCntr = " + seqcountval);
        chargeStatNumber = chargerstat[15];

    };
};

public  void closeConnection() 
{
    //closes connections
    displayMessage("\n\nClosing Connection");

    try 
    {
        writer.close();
        inStream.close();
        sock.close();


    }
    catch ( IOException ioException ) 
      {
         ioException.printStackTrace();
      } // end catch


};



public void displayMessage( final String messageToDisplay )
   {

         new Runnable()
         {
            public void run() // updates displayArea
            {
              //change to log.d for android
                System.out.println(messageToDisplay);
            } // end method run
         };  // end anonymous inner class

   } // end method displayMessage





};    
package charger.app;
导入java.io.BufferedWriter;
导入java.io.DataInputStream;
导入java.io.IOException;
导入java.io.OutputStreamWriter;
导入java.io.PrintWriter;
导入java.io.UnsupportedEncodingException;
导入java.net.InetAddress;
导入java.net.Socket;
导入android.util.Log;
公共类客户端函数
{
私有字符串消息;
私有字符串服务器;
公共插座;
私人版画作家;
流内私有数据输入流;
公共布尔连接;
私有字符串编码=“UTF8”;
公共字节[]chargerstat;
public int chargeStatNumber;//用于将数组字节15设置为int
//向服务器查询费用状态
public void updateStatus()引发IOException
{
//提示用户输入服务器命令
System.out.println(“发送充电器状态数据请求”);
String serverMessage=“meas:充电器?\r\n”;
//发送消息
sendMessage(“meas:充电器?\r\n”);
System.out.println();
显示消息(serverMessage+“已发送”);
//现在接收消息
receiveMessage();
显示消息(“接收完成”);
};
public void connectToServer(字符串serverIp)抛出IOException//服务器IP在主应用程序中作为字符串“serverIp”发送
{
//设置服务器IP
//显示logcat正在尝试连接
显示消息(“\n正在连接”);
//启动套接字连接
sock=新套接字(InetAddress.getByName(serverIp),18088);
//显示连接
displayMessage(“\n连接到:”+
getInetAddress().getHostName());
};
public void getStreams()引发IOException
{
//设置PrintWriter
writer=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()),true);
writer.flush();
//建立我
inStream=newdatainputstream(sock.getInputStream());
//显示收到的消息I/O
显示消息(“\n输入输出流”);
};
public void sendMessage(最终字符串serverMessage)引发UnsupportedEncodingException
{
//设置消息的变量
message=serverMessage;
//发送消息
writer.printf(“%s”,消息);
writer.flush();
//显示已发送的消息
显示消息(“\n发送”/*+serverMessage*/);
};
公共静态int getInt(字节[]数组,int偏移量)
{
返回

((数组[offset+3]&0xff)不能从不同线程更新UI。必须在主线程中更新UI。如果要从不同线程更新UI,可以执行以下操作

public void changeButtonImage(){
    runOnUiThread(new Runnable(){

        @Override
        public void run() {
            connectButton.setImageResource(R.drawable.blue_car);
        }});
}

为什么不使用AsyncTask而不是线程,它将更容易共享信息,并且似乎适用于您正在尝试的操作

使用异步任务

AsyncTask允许您对用户执行异步工作 接口。它在工作线程和 然后在UI线程上发布结果,而无需 自己处理线程和/或处理程序


你的“连接”ChargeActivity中的变量与ServerThread中的变量不同,因此ChargeActivity的connect不会从线程中更新。

android 4.0之后的ui线程中不能使用socket函数,例如您的connect函数和sendMessage

哪些线程外的变量没有被更新?为什么说客户端为keeps连接到服务器(指示是什么)?对不起,我的连接变量以及充电器状态[15],似乎并不总是在线程外更新,我想当一端断开连接时,退出连接状态时会出现问题。连接的内部ServerThread与ChargePractivity中的连接不同。它们之间没有任何关联。好的,谢谢您提供的信息,这是一个非常有用的站点my adventuresIt是一个很棒的网站。如果你接受或更新帮助你或解决问题的答案,它将对你起到更好的作用。它将提高你的接受率,鼓励更多的人帮助你。也就是说,当你确信你的问题已经解决时接受。当你从答案中获得洞察力时,更新投票。