Сокет Клиент - Сервер

686
03 октября 2017, 03:46

Здравствуйте. Есть 2 приложения под андроид, клиент и сервер. Клиент отправляет текст при помощи сокетов. Сервер принимает. Локально это работает, от всех устройств в одной сети сообщения доходят. Как отправить сокет на телефон с сервером за приделами сети? Я так понимаю схема следующая.. глобальный адрес - локальный адрес - порт. Но как это реализовать?

Код сервера

public class MainActivity extends Activity {
 TextView info, infoip, msg;
 String message = "";
 ServerSocket serverSocket;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  info = (TextView) findViewById(R.id.info);
  infoip = (TextView) findViewById(R.id.infoip);
  msg = (TextView) findViewById(R.id.msg);
  infoip.setText(getIpAddress());
  Thread socketServerThread = new Thread(new SocketServerThread());
  socketServerThread.start();
 }
 @Override
 protected void onDestroy() {
  super.onDestroy();
  if (serverSocket != null) {
   try {
    serverSocket.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 private class SocketServerThread extends Thread {
  static final int SocketServerPORT = 8080;
  int count = 0;
  @Override
  public void run() {
   Socket socket = null;
   DataInputStream dataInputStream = null;
   DataOutputStream dataOutputStream = null;
   try {
    serverSocket = new ServerSocket(SocketServerPORT);
    MainActivity.this.runOnUiThread(new Runnable() {
     @Override
     public void run() {
      info.setText("I'm waiting here: "
        + serverSocket.getLocalPort());
     }
    });
    while (true) {
     socket = serverSocket.accept();
     dataInputStream = new DataInputStream(
       socket.getInputStream());
     dataOutputStream = new DataOutputStream(
       socket.getOutputStream());
     String messageFromClient = "";
     //If no message sent from client, this code will block the program
     messageFromClient = dataInputStream.readUTF();
     count++;
     message += "#" + count + " from " + socket.getInetAddress()
       + ":" + socket.getPort() + "\n"
       + "Msg from client: " + messageFromClient + "\n";
     MainActivity.this.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       msg.setText(message);
      }
     });
     String msgReply = "Hello from Android, you are #" + count;
     dataOutputStream.writeUTF(msgReply);
    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    final String errMsg = e.toString();
    MainActivity.this.runOnUiThread(new Runnable() {
     @Override
     public void run() {
      msg.setText(errMsg);
     }
    });
   } finally {
    if (socket != null) {
     try {
      socket.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if (dataInputStream != null) {
     try {
      dataInputStream.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if (dataOutputStream != null) {
     try {
      dataOutputStream.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
  }
 }
 private String getIpAddress() {
  String ip = "";
  try {
   Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
     .getNetworkInterfaces();
   while (enumNetworkInterfaces.hasMoreElements()) {
    NetworkInterface networkInterface = enumNetworkInterfaces
      .nextElement();
    Enumeration<InetAddress> enumInetAddress = networkInterface
      .getInetAddresses();
    while (enumInetAddress.hasMoreElements()) {
     InetAddress inetAddress = enumInetAddress.nextElement();
     if (inetAddress.isSiteLocalAddress()) {
      ip += "SiteLocalAddress: "
        + inetAddress.getHostAddress() + "\n";
     }
    }
   }
  } catch (SocketException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   ip += "Something Wrong! " + e.toString() + "\n";
  }
  return ip;
 }
}

Код клиента

public class MainActivity extends Activity {
 TextView textResponse;
 EditText editTextAddress, editTextPort;
 Button buttonConnect, buttonClear;
 EditText welcomeMsg;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  editTextAddress = (EditText) findViewById(R.id.address);
  editTextPort = (EditText) findViewById(R.id.port);
  buttonConnect = (Button) findViewById(R.id.connect);
  buttonClear = (Button) findViewById(R.id.clear);
  textResponse = (TextView) findViewById(R.id.response);
  welcomeMsg = (EditText)findViewById(R.id.welcomemsg);
  buttonConnect.setOnClickListener(buttonConnectOnClickListener);
  buttonClear.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    textResponse.setText("");
   }
  });
 }
 OnClickListener buttonConnectOnClickListener = new OnClickListener() {
  @Override
  public void onClick(View arg0) {
   String tMsg = welcomeMsg.getText().toString();
   if(tMsg.equals("")){
    tMsg = null;
    Toast.makeText(MainActivity.this, "No Welcome Msg sent", Toast.LENGTH_SHORT).show();
   }
   MyClientTask myClientTask = new MyClientTask(editTextAddress
     .getText().toString(), Integer.parseInt(editTextPort
     .getText().toString()),
     tMsg);
   myClientTask.execute();
  }
 };
 public class MyClientTask extends AsyncTask<Void, Void, Void> {
  String dstAddress;
  int dstPort;
  String response = "";
  String msgToServer;
  MyClientTask(String addr, int port, String msgTo) {
   dstAddress = addr;
   dstPort = port;
   msgToServer = msgTo;
  }
  @Override
  protected Void doInBackground(Void... arg0) {
   Socket socket = null;
   DataOutputStream dataOutputStream = null;
   DataInputStream dataInputStream = null;
   try {
    socket = new Socket(dstAddress, dstPort);
    dataOutputStream = new DataOutputStream(
      socket.getOutputStream());
    dataInputStream = new DataInputStream(socket.getInputStream());
    if(msgToServer != null){
     dataOutputStream.writeUTF(msgToServer);
    }
    response = dataInputStream.readUTF();
   } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = "UnknownHostException: " + e.toString();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = "IOException: " + e.toString();
   } finally {
    if (socket != null) {
     try {
      socket.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if (dataOutputStream != null) {
     try {
      dataOutputStream.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if (dataInputStream != null) {
     try {
      dataInputStream.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
   return null;
  }
  @Override
  protected void onPostExecute(Void result) {
   textResponse.setText(response);
   super.onPostExecute(result);
  }
 }
}
READ ALSO
XmlPullParser парсинг xml элемента

XmlPullParser парсинг xml элемента

Есть такой простой код (пишу читалку fb2)

272
Нужно ли каждый раз стартовать дебаггер?

Нужно ли каждый раз стартовать дебаггер?

Можно ли в Android Studio дебажить сам проект, а не ставить определенные точки остановки? Хочу отследить полностью, а не по отдельным точкамИ можно...

300
Автообноление activity android

Автообноление activity android

Есть приложение с выводом на экран текущего значения заряда батареиКод:

366