2015-07-27 1 views
2

Я использую приложение для чата, где сервер является Java и клиент в android. мой код сервера написан на Java-языке, используя сокет-программирование. Когда я подключаю свой Android-телефон (интернет включен) к ноутбуку и запускаю как сервер, так и клиент, тогда он работает нормально. в моем клиентском приложении мне нужно ввести IP-адрес серверной машины, который похож на этот 192.168. .. когда клиент посылает массаж на сервер, а затем сервер возвращает ответ клиенту. это нормально.Связь с сервером и сервером Java на разных сетях

но когда я запускаю клиента с другого телефона Android, которого нет в моей домашней сети (предположим, что мой друг находится у него дома и пытается подключиться к java-серверу (в моем доме) через Интернет). Тогда сервер не показывал соединение установить. Я также пытаюсь поставить свой общедоступный IP-адрес из Google в клиентское приложение, когда вы начинаете, но все равно никакого ответа.

код сервера ..

public class SimpleChatServer { 
static int port_num =4444; 
    public static void main(String[] args) { 

     ServerSocket serverSocket = null; 
     Socket clientSocket = null; 

     try { 
      serverSocket = new ServerSocket(port_num); 
      System.out.println("Server started. Listening to the port 4444. Waitng for the client."); 
      clientSocket = serverSocket.accept(); 
      System.out.println("Client connected on port 4444."); 
      port_num++; 
     } catch (IOException e) { 
      System.out.println("Could not listen on port: 4444"); 
      e.printStackTrace(); 
      return; 
     } 

пожалуйста, любой приятель может сказать мне, что я должен делать? как подключить клиента к серверу? и что такое ip-адрес от ipconfig и какой у меня IP-адрес от Google?

это мой клиентский код для Android.

 public class SimpleClientServerChatActivity extends Activity { 

      private EditText textField,ipaddrs; 
      private Button button, start; 
      private TextView textView; 
      private Socket client; 
      private PrintWriter printwriter; 
      private BufferedReader bufferedReader; 

      //Following is the IP address of the chat server. You can change this IP address according to your configuration. 
      // I have localhost IP address for Android emulator. 
      private String CHAT_SERVER_IP = null; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_simple_client_server_chat); 
       textField = (EditText) findViewById(R.id.editText1); 
       button = (Button) findViewById(R.id.button1); 
       textView = (TextView) findViewById(R.id.textView1); 
       ipaddrs = (EditText) findViewById(R.id.ipaddrs); 
       start = (Button) findViewById(R.id.start); 

       start.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
###############// there client enter server public ip address via mobile app 
         CHAT_SERVER_IP = String.valueOf(ipaddrs.getText()); 
         ChatOperator chatOperator = new ChatOperator(); 
         chatOperator.execute(); 
        } 
       }); 



      } 

      /** 
      * This AsyncTask create the connection with the server and initialize the 
      * chat senders and receivers. 
      */ 
      private class ChatOperator extends AsyncTask<Void, Void, Void> { 

       @Override 
       protected Void doInBackground(Void... arg0) { 
        try { 
         client = new Socket(CHAT_SERVER_IP, 4444); // Creating the server socket. 

         if (client != null) { 
          printwriter = new PrintWriter(client.getOutputStream(), true); 
          InputStreamReader inputStreamReader = new InputStreamReader(client.getInputStream()); 
          bufferedReader = new BufferedReader(inputStreamReader); 
         } else { 
          System.out.println("Server has not bean started on port 4444."); 
         } 
        } catch (UnknownHostException e) { 
         System.out.println("Faild to connect server " + CHAT_SERVER_IP); 
         e.printStackTrace(); 
        } catch (IOException e) { 
         System.out.println("Faild to connect server " + CHAT_SERVER_IP); 
         e.printStackTrace(); 
        } 
        return null; 
       } 

       /** 
       * Following method is executed at the end of doInBackground method. 
       */ 
       @Override 
       protected void onPostExecute(Void result) { 
        button.setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          final Sender messageSender = new Sender(); // Initialize chat sender AsyncTask. 
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
           messageSender.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
          } else { 
           messageSender.execute(); 
          } 
         } 
        }); 

        Receiver receiver = new Receiver(); // Initialize chat receiver AsyncTask. 
        receiver.execute(); 

       } 

      } 

      /** 
      * This AsyncTask continuously reads the input buffer and show the chat 
      * message if a message is availble. 
      */ 
      private class Receiver extends AsyncTask<Void, Void, Void> { 

       private String message; 

       @Override 
       protected Void doInBackground(Void... params) { 
        while (true) { 
         try { 

          if (bufferedReader.ready()) { 
           message = bufferedReader.readLine(); 
           publishProgress(null); 
          } 
         } catch (UnknownHostException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

         try { 
          Thread.sleep(500); 
         } catch (InterruptedException ie) { 
         } 
        } 
       } 

       @Override 
       protected void onProgressUpdate(Void... values) { 
        textView.append("Server: " + message + "\n"); 
       } 

      } 

      /** 
      * This AsyncTask sends the chat message through the output stream. 
      */ 
      private class Sender extends AsyncTask<Void, Void, Void> { 

       private String message; 

       @Override 
       protected Void doInBackground(Void... params) { 
        message = textField.getText().toString(); 
        printwriter.write(message + "\n"); 
        printwriter.flush(); 

        return null; 
       } 

       @Override 
       protected void onPostExecute(Void result) { 
        textField.setText(""); // Clear the chat box 
        textView.append("Client: " + message + "\n"); 
       } 
      } 

      @Override 
      public boolean onCreateOptionsMenu(Menu menu) { 
       // Inflate the menu; this adds items to the action bar if it is present. 
       getMenuInflater().inflate(R.menu.menu_simple_client_server_chat, menu); 
       return true; 
      } 



     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 

      //noinspection SimplifiableIfStatement 
      if (id == R.id.action_settings) { 
       return true; 
      } 

      return super.onOptionsItemSelected(item); 
     } 
    } 

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

+0

Если вы попытаетесь подключиться к сети, вам может потребоваться просмотреть перенаправление портов через маршрутизатор. – 3kings

+0

Я знаю о переадресации портов. но я получаю доступ к интернету через свой мобильный телефон. поэтому в моем конце нет маршрутизатора. так как я могу использовать переадресацию портов. –

+0

Да, но вы пытаетесь подключиться к своему компьютеру, на котором сервер работает где-то еще, я прав? – 3kings

ответ

3

Вы должны запустить свой файл jar на сервере с public IP. Адрес на вашем компьютере - это ваш локальный IP-адрес. Более того, иногда точка доступа WiFi может блокировать порт 4444, например, в общественном месте (McDonald's, Edurom, KFC и т. Д.). Вы должны это помнить.

Таким образом, настроить свой собственный Sever с открытым IP, запустите сервер с

java -jar server.jar 

, а затем проверить его.

Например, это список доступных портов в Edurom (University WiFi). Как и я, порт 4444 здесь заблокирован. enter image description here

+0

спасибо ... он очень полезен –

+0

Более того, вы можете использовать прокси-сервер и слушать на своем сервере, например, на 80-м порту. Даже если у вас есть apache на том же порту. Вот пример для Socket.IO. http://stackoverflow.com/questions/5969607/is-it-possible-to-use-port-80-for-both-http-and-web-socket-traffic/35780985#35780985 – EliaszKubala