2017-01-07 2 views
1

Я пытаюсь создать соединение между двумя приложениями с помощью Android. Я попытался использовать сокеты для подключения. Я создал два приложения Один, который принимает соединение, когда клиент хочет подключиться и другое приложение, которое запрашивает подключение.создание соединения в устройстве android с использованием сокетов

Я успешно выполнил этот код таким же образом в ПК в java в сети pc. Способ подключения к андроиду тоже такой же?

Моей реализация класса сервера

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) 

ответ

0

Это не потому, что «соединение» не будет создано. Вероятно, потому, что он не смог подключиться или он был отключен, и он перешел к следующему коду. Если он был отключен или не был подключен, вам нужно поймать это исключение и повторить попытку подключения, прежде чем переходить к вашему более позднему коду.

Розетка может быть сложной, если вы не поймаете все ошибочные состояния, в которые они могут попасть.

просто обернуть попробовать и поймать с петлей в то время, пока условие не будет выполнено, как это:

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(); 
    } 
} 
+0

это не сработало, я думаю, что может быть адрес отличается для андроид телефонов –

Смежные вопросы