Как получить простой Android-клиент и ПК-сервер заработать - PullRequest
0 голосов
/ 31 января 2011

У меня есть простой сервер на моем компьютере и простой клиент на моем htc desire под управлением Android 2.2.

Сервер и клиент используют один и тот же порт. Я жестко закодирую ip серверов в код клиента. Когда я пытаюсь подключиться к работающему серверу через клиент на Android, клиент выдает это исключение:

IOException ...: java.net.SocketException: The operation timed out.

Вот части кода клиента и сервера:

код клиента

  InetAddress addr;
  Socket socket = null;

  byte [] ipAddress = new byte[] {(byte)82,(byte)168,(byte)175,(byte)141};

  try{

   addr = InetAddress.getByAddress(ipAddress);

   socket = new Socket(addr, 1234);
   System.out.println("socket = "+socket);

   BufferedReader in = new BufferedReader(
            new InputStreamReader(
             socket.getInputStream()));

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

        out.println("hello");
        socket.close();
  } catch (UnknownHostException e) {
   System.out.println("UnknownHostException ...: "+e);
  } catch (IOException e) {
   System.out.println("IOException ...: "+e);
  }

код сервера

    ServerSocket ss = new ServerSocket(PORT);
  System.out.println("Started:"+ss);

  try{
   //block until a connection occures
   Socket socket = ss.accept();

   try{
    System.out.println("Conncetion accepted:"+socket);
    InputStream IS = socket.getInputStream();
    InputStreamReader ISR = new InputStreamReader(IS);
    BufferedReader in = new BufferedReader(ISR);

    OutputStream OS = socket.getOutputStream();
    OutputStreamWriter OSR= new OutputStreamWriter(OS);
    BufferedWriter BW = new BufferedWriter(OSR);
    //output automatically flushed by PrintWriter
    PrintWriter out = new PrintWriter(BW,true);

    while(true){
     String str = in.readLine();
     System.out.println("Client: "+str);
     out.println("hi");
    }
   }finally{
    System.out.println("Closing...");
    socket.close();
   }
  }finally{
   ss.close();
  }

Этот код работает через Wi-Fi, но не через 3g.

Любая помощь приветствуется ... и заранее спасибо.

1 Ответ

3 голосов
/ 31 января 2011

Возможно, вы используете маршрутизатор / точку доступа Wi-Fi для подключения к Интернету?

Если ваш маршрутизатор использует протокол NAT , то никакие устройства в Интернете не смогут открыть соединение с вашимПК.NAT только позволяет ПК открывать подключение к Интернету, а не наоборот.

Поэтому, когда ваш телефон подключен к Wi-Fi, он может подключаться к ПК, поскольку они оба находятся в одной сети, а NAT не используется.Когда ваш телефон подключен к сети 3g и, следовательно, к Интернету, между вашим телефоном и ПК есть NAT.

Решение:

Включите переадресацию портов на маршрутизаторе, чем соединитесь сваше приложение на IP-адрес маршрутизатора, который будет перенаправлять это соединение на ваш компьютер.

...