2016-10-02 4 views
0

Я создаю простое приложение, в котором я хочу отправить сообщение по локальному Wi-Fi-соединению с помощью TCP. Поэтому я создаю точку доступа на одном устройстве и подключаю его с другого устройства.Не удается отправить сообщение через точку доступа, используя TCP-соединение. Android

Теперь, на хостинге, я запускаю следующее серверное приложение и подключаю устройство. Я запускаю клиентское приложение.

Но ничего не происходит, когда я нажимаю кнопку send на клиентском устройстве. Мой код для сервера и клиента выглядит следующим образом:

Код для сервера:

import android.os.Bundle; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Handler; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

private ServerSocket serverSocket; 

Handler updateConversationHandler; 

Thread serverThread = null; 

private TextView text; 

public static final int SERVERPORT = 6000; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

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

    text = (TextView) findViewById(R.id.text2); 

    updateConversationHandler = new Handler(); 

    this.serverThread = new Thread(new ServerThread()); 
    this.serverThread.start(); 

} 

@Override 
protected void onStop() { 
    super.onStop(); 
    try { 
     serverSocket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

class ServerThread implements Runnable { 

    public void run() { 
     Socket socket = null; 
     try { 
      serverSocket = new ServerSocket(SERVERPORT); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     while (!Thread.currentThread().isInterrupted()) { 

      try { 

       socket = serverSocket.accept(); 

       CommunicationThread commThread = new CommunicationThread(socket); 
       new Thread(commThread).start(); 

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

class CommunicationThread implements Runnable { 

    private Socket clientSocket; 

    private BufferedReader input; 

    public CommunicationThread(Socket clientSocket) { 

     this.clientSocket = clientSocket; 

     try { 

      this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 

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

    public void run() { 

     while (!Thread.currentThread().isInterrupted()) { 

      try { 

       String read = input.readLine(); 

       updateConversationHandler.post(new updateUIThread(read)); 

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

} 

class updateUIThread implements Runnable { 
    private String msg; 

    public updateUIThread(String str) { 
     this.msg = str; 
    } 

    @Override 
    public void run() { 
     text.setText(text.getText().toString()+"Client Says: "+ msg + "\n"); 
    } 
} 
} 

Код для клиента:

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.Socket; 
import java.net.SocketException; 
import java.net.UnknownHostException; 
import java.util.Enumeration; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

private Socket socket; 
private String TAG="XXX"; 

private static final int SERVERPORT = 5000; 
private String SERVER_IP ; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new Thread(new ClientThread()).start(); 

    SERVER_IP = getWifiApIpAddress(); 

} 

public String getWifiApIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en 
       .hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      if (intf.getName().contains("wlan")||intf.getName().contains("ap")) { 
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr 
         .hasMoreElements();) { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        if (!inetAddress.isLoopbackAddress() 
          && (inetAddress.getAddress().length == 4)) { 
         Log.d(TAG, inetAddress.getHostAddress()); 
         return inetAddress.getHostAddress(); 
        } 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(TAG, ex.toString()); 
    } 
    return null; 
} 

public void onClick(View view) { 
    try { 
     EditText et = (EditText) findViewById(R.id.EditText01); 
     String str = et.getText().toString(); 
     PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(socket.getOutputStream())), 
       true); 
     out.println(str); 
    //  out.flush(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

class ClientThread implements Runnable { 

    @Override 
    public void run() { 

     try { 
      InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 

      socket = new Socket(serverAddr, SERVERPORT); 

     } catch (UnknownHostException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

    } 

} 
} 

Я следую this tutorial. Как объяснено там, он работает нормально в эмуляторах Android. Но не работает на реальных устройствах.

Итак, я думал, что IP-адрес должен отличаться от разных горячих точек. Поэтому я написал метод в клиентском коде для получения IP-адреса hotspot сервера и подключения к нему. Но при нажатии кнопки send ничего не происходит.

Итак, что мне здесь не хватает? Правильно ли мой метод? Есть ли ошибки в номерах портов?

В учебнике автор делает что-то, называемое переадресацией портов. Как насчет перенаправления портов для реальных устройств?

Я искал всюду для этого в Интернете, но не могу найти точного решения или любого учебника, объясняющего этот тип приложения. Пожалуйста, помогите мне!

EDIT:

, когда я запускаю это в реальных устройствах, это дает NllPointerException в коде клиентов, на следующей строке:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
+0

@greenapps отредактировал мой вопрос. Но, пожалуйста, помогите мне! –

+0

Его также не рекомендуется плакать 'Пожалуйста, помогите мне. – greenapps

+0

Его также желательно, чтобы, если вы не знаете ответа на вопрос, не комментируйте его. @greenapps –

ответ

0

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

Мы пересылаем порт в эмулятор, потому что он работает на хост-машине &. Мы говорим хосту, чтобы он передавал трафик, идущий на этом конкретном порту, в эмулятор, поскольку в реальном устройстве вам не нужно это делать, чтобы вы просто необходимо убедиться, что ваше устройство находится в той же сети. & Вызывается правильный порт.

+0

Как использовать указанные жестко кодированные порты? –

+1

«вам нужно только убедиться, что ваше устройство находится в одной сети». Это может быть проблемой. Я склонен полагать, что приложение не может использовать сеть Wi-Fi, пока устройство находится в режиме точки доступа ... – JimmyB

+1

, но если одно устройство создает точку доступа, а другое подключается к нему, то и оно называется «в одной сети» @JimmyB –