Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 使用套接字在android设备中创建连接_Java_Android_Sockets_Serversocket - Fatal编程技术网

Java 使用套接字在android设备中创建连接

Java 使用套接字在android设备中创建连接,java,android,sockets,serversocket,Java,Android,Sockets,Serversocket,我正在尝试使用android在两个应用程序之间创建连接。我试着用插座连接。我创建了两个应用程序 当客户端想要连接时接受连接的一种 以及另一个请求连接的应用程序 我已经在pc网络中用java在pc上以同样的方式成功地运行了这段代码。连接android的方式也一样吗 我的服务器类实现 public class MainActivity extends AppCompatActivity { private Button startButton; private ServerSock

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

我已经在pc网络中用java在pc上以同样的方式成功地运行了这段代码。连接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)
这是因为“连接”从未创建过。可能是因为它无法连接,或者它超时并转到下一个代码。如果它超时或未连接,则需要捕获该异常并重试连接,然后再继续后续代码

如果您不能捕获套接字可能进入的所有错误状态,那么套接字可能会很棘手

只需使用while循环结束try-and-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();
    }
}
这是因为“连接”从未创建过。可能是因为它无法连接,或者它超时并转到下一个代码。如果它超时或未连接,则需要捕获该异常并重试连接,然后再继续后续代码

如果您不能捕获套接字可能进入的所有错误状态,那么套接字可能会很棘手

只需使用while循环结束try-and-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();
    }
}

这不起作用,我想可能是android手机的地址不同。这不起作用,我想可能是android手机的地址不同