【问题标题】:creating connection within android device using sockets使用套接字在 android 设备中创建连接
【发布时间】:2017-01-07 03:27:31
【问题描述】:

我正在尝试使用 android 在两个应用程序之间创建连接。我曾尝试使用套接字进行连接。我创建了两个应用程序 当客户端想要连接时接受连接的一种 以及另一个请求连接的应用程序。

我已在 pc 网络中的 java 中以相同的方式成功运行此代码。连接android的方式也一样吗?

我的服务器类实现

public class MainActivity extends AppCompatActivity {

    private Button startButton;
    private ServerSocket server;
    private Socket connection;
    private TextView statusText;
    private ObjectOutputStream output;
    private ObjectInputStream input;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
statusText=(TextView)findViewById(R.id.statusText);
        startButton=(Button)findViewById(R.id.startButton);
        startButton.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        startRunning();


                    }
                }
        );



    }

    private void startRunning() {

        try{

            server=new ServerSocket(8080);
            while(true)
            {

                try{

                    waitForConnection();
                    setUpStreams();
                    whileChatting();



                }catch(Exception e){}

            }



        } catch(Exception e){}
    }


    public void waitForConnection()
    {

       setMyStatus("Waiting for client to connect...");
        try {
            connection= server.accept();
           setMyStatus("Now connected to "+ connection.getInetAddress().getHostName());


        } catch (IOException e) {
            e.printStackTrace();
        }


    }


    public void setUpStreams()
    {
        try {
             output= new ObjectOutputStream(connection.getOutputStream());
             output.flush();
             input= new ObjectInputStream(connection.getInputStream());
            setMyStatus("Streams are now setup. Ready to go...");



        } catch (IOException e) {
            e.printStackTrace();
        }


    }
    public void whileChatting()
    {
setMyStatus("You can now start chatting...");


    }
    public void setMyStatus(String msg) {
        statusText.setText(msg);
    }


}

稍后我将使用异步任务之类的任务。但我只是想在这些应用程序中建立连接。 我的客户端实现是这样的

public class MainActivity extends AppCompatActivity {
private Button startButton;
private Socket connection;
private TextView statusText;
public ObjectOutputStream output;
public ObjectInputStream input;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    statusText=(TextView)findViewById(R.id.statusText);
    startButton=(Button)findViewById(R.id.startButton);
    startButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startRunning();
        }
    });

}





private void startRunning() {

   connectToServer();
    setUpStreams();
    whileChatting();

}


public void  connectToServer()
{

  setMyStatus("Connecting to server. Please wait...");
    try {
        connection= new Socket(InetAddress.getByName("127.0.0.1"),8080);
        setMyStatus("Connected to Server."+ connection.getInetAddress().getHostName());


    } catch (IOException e) {
        e.printStackTrace();
    }

}


public void setUpStreams()
{
    try {
        output= new ObjectOutputStream(connection.getOutputStream());
        output.flush();
        input= new ObjectInputStream(connection.getInputStream());
        setMyStatus("Streams are now setup. Ready to go...");



    } catch (IOException e) {
        e.printStackTrace();
    }


}
public void whileChatting()
{
    setMyStatus("You can now start chatting...");


}
public void setMyStatus(String msg) {
    statusText.setText(msg);
}



}

我得到的错误是客户端尝试连接到服务器的情况

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.OutputStream java.net.Socket.getOutputStream()' on a null object reference
                                                                             at com.myapp.client.clientdemo.MainActivity.setUpStreams(MainActivity.java:71)
                                                                             at com.myapp.client.clientdemo.MainActivity.startRunning(MainActivity.java:46)
                                                                             at com.myapp.client.clientdemo.MainActivity.access$000(MainActivity.java:16)
                                                                             at com.myapp.client.clientdemo.MainActivity$1.onClick(MainActivity.java:33)

【问题讨论】:

    标签: java android sockets serversocket


    【解决方案1】:

    这是因为从未创建过“连接”。可能是因为它无法连接或超时,然后继续执行下一个代码。如果它超时或未连接,那么您需要捕获该异常并重试连接,然后再继续使用以后的代码。

    如果您没有捕捉到它们可能进入的所有错误状态,那么套接字可能会很棘手。

    只需用 while 循环包装你的 try 和 catch,直到满足条件,如下所示:

    while(!connected & !closed){
        try {
            connection= new Socket(InetAddress.getByName("127.0.0.1"),8080);
            connected = true;
            //now it is connected and will exit the loop and continue with other code
        } catch (SocketTimeoutException socketTimeoutException) {
            //add this for safety
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 这不起作用,我认为可能是安卓手机的地址不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多