1

我在安卓上有问题。我有一个应用程序向用户询问本地 IP 地址(来自设备的接口)和另一个远程地址。应用程序必须绑定到指定的本地地址并连接到远程地址。很简单,但实际上,bind 并没有像我预期的那样工作..

我在清单文件上添加了以下权限:

<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 。所以它仍然为空。那是行不通的。您需要先创建一个 Socket 实例,然后才能对其调用方法。

于 2013-03-26T21:04:13.170 回答