2015-04-18 5 views
-1

У меня есть два приложения, которые я пытаюсь подключить с помощью сокетов. Я пытаюсь его протестировать, но проблема в том, что он работает только тогда, когда я использую то же соединение Wi-Fi на телефоне. один телефон имеет клиента, а другой - сервер. мой вопрос, как я подключить его, когда они не на той же Wi-Fi сетиСообщение сокета для Android

Это клиент

package com.example.androidclient; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    TextView textResponse; 
    EditText editTextAddress, editTextPort; 
    Button buttonConnect, buttonClear; 

    @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); 

     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) { 
        MyClientTask myClientTask = new MyClientTask(
          editTextAddress.getText().toString(), 
          Integer.parseInt(editTextPort.getText().toString())); 
        myClientTask.execute(); 
       }}; 

    public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     String dstAddress; 
     int dstPort; 
     String response = ""; 

     MyClientTask(String addr, int port){ 
      dstAddress = addr; 
      dstPort = port; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      Socket socket = null; 

      try { 
       socket = new Socket(dstAddress, dstPort); 

       ByteArrayOutputStream byteArrayOutputStream = 
         new ByteArrayOutputStream(1024); 
       byte[] buffer = new byte[1024]; 

       int bytesRead; 
       InputStream inputStream = socket.getInputStream(); 

       /* 
       * notice: 
       * inputStream.read() will block if no data return 
       */ 
       while ((bytesRead = inputStream.read(buffer)) != -1){ 
        byteArrayOutputStream.write(buffer, 0, bytesRead); 
        response += byteArrayOutputStream.toString("UTF-8"); 
       } 

      } 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(); 
        } 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      textResponse.setText(response); 
      super.onPostExecute(result); 
     } 

    } 

} 

это я severcode

package com.example.androidserversocket; 

import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketException; 
import java.util.Enumeration; 

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

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 = 3333; 
     int count = 0; 

     @Override 
     public void run() { 
      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 socket = serverSocket.accept(); 
        count++; 
        message += "#" + count + " from " + socket.getInetAddress() 
          + ":" + socket.getPort() + "\n"; 

        MainActivity.this.runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          msg.setText(message); 
         } 
        }); 

        SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
          socket, count); 
        socketServerReplyThread.run(); 

       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

    private class SocketServerReplyThread extends Thread { 

     private Socket hostThreadSocket; 
     int cnt; 

     SocketServerReplyThread(Socket socket, int c) { 
      hostThreadSocket = socket; 
      cnt = c; 
     } 

     @Override 
     public void run() { 
      OutputStream outputStream; 
      String msgReply = "Hello from Android, you are #" + cnt; 

      try { 
       outputStream = hostThreadSocket.getOutputStream(); 
       PrintStream printStream = new PrintStream(outputStream); 
       printStream.print(msgReply); 
       printStream.close(); 

       message += "replayed: " + msgReply + "\n"; 

       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         msg.setText(message); 
        } 
       }); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       message += "Something wrong! " + e.toString() + "\n"; 
      } 

      MainActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        msg.setText(message); 
       } 
      }); 
     } 

    } 

    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; 
    } 
} 

я получил идею с этого сайта http://android-er.blogspot.com/2014/02/android-sercerclient-example-server.html

+0

"не идет" не является хорошим описанием ошибки. Пожалуйста, предоставьте подробную информацию о том, что работает и что не работает, в том числе, возможно, сообщение об ошибке. Кроме того, вы удостоверились, что телефоны могут достичь друг друга по сети? И нет, что оба имеют подключение к Интернету не обязательно достаточно. – dhke

+1

@arinze. Вы можете подключить клиента к серверу только тогда, когда он доступен по сети. Используя то же соединение Wi-Fi, это означает, что они находятся в одной локальной сети, и они доступны с использованием локального IP-адреса. Но когда они находятся в разных Wi-Fi-соединениях, вы должны переносить свой маршрутизатор на свой мобильный телефон, где серверное устройство прослушивает и указывая публичный IP-адрес маршрутизатора на вашем клиенте. Убедитесь, что вы используете эфемерный порт. Когда вы не подключены к маршрутизатору, и если вы используете мобильное подключение к данным, некоторые поставщики сетевых данных могут блокировать порты. – Praveen

+0

Можете ли вы показать мне пример, как использовать эфемерный порт. или я должен просто использовать уведомление Google Push – arinze

ответ

1

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

Чтобы реализовать связь устройства с устройством, вам понадобится фактический сервер, находящийся за пределами устройства, к которому могут подключаться устройства (например, возможно, развертывать его на рабочем столе, когда вы находитесь на Wi-Fi, и пусть устройства находят его или сделать реальную сделку и развернуть ее на реальном сервере - может стоить денег). Пример приложения для этого можно найти по адресу https://github.com/Pirngruber/AndroidIM. Приложение написано для Android и использует сборки типа Eclipse, но кроме этого исходный код работает хорошо - я использовал это в прошлом.

Или вы можете посмотреть приложения push-сообщений. учебные пособия для чат-приложений с использованием Google Cloud-обмена сообщениями - это десятки десятков. Хотя они не используют серверы в том смысле, что мы развертываем приложения, они используют систему push google для отправки и получения сообщений.

+0

Мне трудно понять код в ссылке, которую вы сохранили – arinze

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