2014-12-24 1 views
0

Это мой код:Java прокси не показывая ничего: клиент <--> сервер

import java.io.*; 
import java.net.*; 

public class proxy { 
    public static void main(String[] args) throws IOException { 
    try { 
     String host = "gamea.clashofclans.com"; 
     int remoteport = 9339; 
     ServerSocket ss = new ServerSocket(0); 
     int localport = ss.getLocalPort(); 
     ss.setReuseAddress(true); 
     // Print a start-up message 
     System.out.println("Starting proxy for " + host + ":" + remoteport 
      + " on port " + localport); 
     // And start running the server 
     runServer(host, remoteport, localport,ss); // never returns 
     System.out.println("Started proxy!"); 
    } catch (Exception e) { 
     System.err.println(e); 
    } 
    } 

    /** 
    * runs a single-threaded proxy server on 
    * the specified local port. It never returns. 
    */ 
    public static void runServer(String host, int remoteport, int localport, ServerSocket ss) 
     throws IOException { 
    // Create a ServerSocket to listen for connections with 
    System.out.println("Connected to Client!"); 

    final byte[] request = new byte[2048]; 
    byte[] reply = new byte[4096]; 

    while (true) { 
     Socket client = null, server = null; 
     try { 
     // Wait for a connection on the local port 
     client = ss.accept(); 
     System.out.println("Client Accepted!"); 

     final InputStream streamFromClient = client.getInputStream(); 
     final OutputStream streamToClient = client.getOutputStream(); 

     // Make a connection to the real server. 
     // If we cannot connect to the server, send an error to the 
     // client, disconnect, and continue waiting for connections. 
     try { 
      server = new Socket(host, remoteport); 
      System.out.println("Client connected to server."); 
     } catch (IOException e) { 
      PrintWriter out = new PrintWriter(streamToClient); 
      out.print("Proxy server cannot connect to " + host + ":" 
       + remoteport + ":\n" + e + "\n"); 
      out.flush(); 
      client.close(); 
      System.out.println("Client disconnected"); 
      continue; 
     } 

     // Get server streams. 
     final InputStream streamFromServer = server.getInputStream(); 
     final OutputStream streamToServer = server.getOutputStream(); 

     // a thread to read the client's requests and pass them 
     // to the server. A separate thread for asynchronous. 
     Thread t = new Thread() { 
      public void run() { 
      int bytesRead; 
      try { 
       while ((bytesRead = streamFromClient.read(request)) != -1) { 
       streamToServer.write(request, 0, bytesRead); 
       streamToServer.flush(); 
       } 
      } catch (IOException e) { 
      } 

      // the client closed the connection to us, so close our 
      // connection to the server. 
      try { 
       streamToServer.close(); 
      } catch (IOException e) { 
      } 
      } 
     }; 

     // Start the client-to-server request thread running 
     t.start(); 

     // Read the server's responses 
     // and pass them back to the client. 
     int bytesRead; 
     try { 
      while ((bytesRead = streamFromServer.read(reply)) != -1) { 
      streamToClient.write(reply, 0, bytesRead); 
      streamToClient.flush(); 
      } 
     } catch (IOException e) { 
     } 

     // The server closed its connection to us, so we close our 
     // connection to our client. 
     streamToClient.close(); 
     } catch (IOException e) { 
     System.err.println(e); 
     } finally { 
     try { 
      if (server != null) 
      server.close(); 
      if (client != null) 
      client.close(); 
     } catch (IOException e) { 
     } 
     } 
    } 
    } 
} 

Когда я запускаю его я получаю сообщение «Connected к клиенту» (строка 40), но после этого ничего не происходит в окно. Я не понимаю, что «Клиент подключился к серверному сообщению», поэтому я предполагаю, что проблема где-то там?

Почему это происходит? Кто-нибудь знает исправить?

Я очень новичок в java, поэтому, пожалуйста, не сурова меня.

ответ

0

«Подключен к клиенту!» сообщение вводит в заблуждение. В этот момент вы начинаете свой сервер, и клиенты скоро смогут подключиться, но клиенты еще не подключены. Ваша программа ждет

client = ss.accept(); 

для возврата. ServerSocket.accept ждет соединения, которое должно быть выполнено через порт. Вам понадобится другой поток, программа или компьютер для подключения к этому порту, чтобы начать их размещение в качестве клиента. Убедитесь, что этот другой поток, программа или компьютер настроены правильно для подключения к открытому порту. Вероятно, вам нужно либо установить ServerSocket для использования фиксированного порта, либо определить, какой порт он открыл сокет, и сообщить другой программе, какой порт использовать.

+0

У меня есть игра на bluestacks, которая использует порт 9339. Всё равно работать не будет. –

+0

@Shiv '9339' - это порт на' gamea.clashofclans.com', к которому вы подключаетесь; вашему клиенту необходимо подключиться к порту 'localport', который может меняться каждый раз, когда вы запускаете эту программу. – Vitruvius

+0

Как это сделать? ... –

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