1

私はアンドロイドに問題があります。(デバイスのインターフェイスからの)ローカルIPアドレスと別のリモートアドレスをユーザーに要求するアプリケーションがあります。アプリケーションは、指定されたローカルアドレスにバインドし、リモートアドレスに接続する必要があります。非常に単純ですが、確かに、バインドは私が期待したお尻では機能しません。

マニフェストファイルに次の権限を追加しました。

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

ソースコードは次のとおりです。

public class MainActivity extends Activity
{
String Tag = "TAG";
private int LOCAL_PORT = 4444;
private int REMOTE_PORT = 80;
private EditText LOCAL;
private EditText REMOTE;
private Button Connect;
private TextView STATUS;
private Context context = this;


@Override
public void onCreate(Bundle savedInstanceState) 
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);   


    LOCAL = (EditText) findViewById(R.id.editText1);
    REMOTE = (EditText) findViewById(R.id.editText2);
    Connect = (Button) findViewById(R.id.button1);

    Connect.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v)
        {
            BotleneckHandle WORK;

            Toast.makeText(getApplicationContext(), "Proceeding to connect",
                 Toast.LENGTH_SHORT).show();
        /*  
            if(LOCAL.getText().toString() == null || REMOTE.getText().toString() == null || LOCAL.getText().toString().equals(" ") || REMOTE.getText().toString().equals(" ") || LOCAL.getText().toString().equals("") || REMOTE.getText().toString().equals(""))
                Toast.makeText(context, "Wrong parameters", 2000);
            else
        {
            Toast.makeText(getApplicationContext(), "Proceeding to connect",Toast.LENGTH_SHORT).show();

        }*/

            WORK = new BotleneckHandle();       
            WORK.execute();
        }
    });

    STATUS = (TextView) findViewById(R.id.textView1);
}


 private class BotleneckHandle extends AsyncTask <Void , Void , String>
 {
     Socket Skt = null;
     String ReturnStatemente = new String();
     SocketAddress localAddr = new InetSocketAddress(LOCAL.getText().toString(), LOCAL_PORT);

    protected void onPreExecute(){  }
    protected String doInBackground(Void... params) 
    {

        try 
        {

            String s=new String();

            s+= "Local="+LOCAL.getText().toString()+":"+LOCAL_PORT+"  Remote="+REMOTE.getText().toString()+":"+REMOTE_PORT;  //so far so good, Confirmed by debug

            Toast.makeText(getApplicationContext(), s,Toast.LENGTH_SHORT).show();  //Does not show anything due the fact that i didn't published it as an assync task update.. 

            //binding to a local address
            Skt.bind(localAddr);            //cannot make the bind :-/

            //connecting to remote host
            Skt=new Socket(REMOTE.getText().toString(), REMOTE_PORT);   //if bind is comment, still does not work.. I bet
            ReturnStatemente = "Connected";

        } 
        catch (UnknownHostException e) 
        {   
            e.printStackTrace();
            Toast.makeText(context, "Unknown remote host", 2000);
            ReturnStatemente = "Not Connected";
        } 
        catch (IOException e) 
        {   
            e.printStackTrace();        
            Toast.makeText(context, "Connection fail", 2000);   
            ReturnStatemente = "Not Connected";
        }
        finally{try {
            Skt.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }}
        return ReturnStatemente;   

    }

    protected void onPostExecute(String result)  {    STATUS.setText(" CONECTION STATUS == " + result);    }



  } 

}

バインドで何が間違っていますか?私が見る限り、そして私がその良いものを探したとき..私は何かを逃しましたか?

敬具

4

1 に答える 1

2

変数に何かを割り当てる前に、変数に対してbindを呼び出そうとしています。したがって、それはまだnullです。それはうまくいきません。メソッドを呼び出す前に、Socketのインスタンスを作成する必要があります。

于 2013-03-26T21:04:13.170 に答える