2015-10-01 4 views
0

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

Сервер:

import java.io.BufferedReader; 
import java.io.IOException;  
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Server { 


public static void main(String[] args) { 

    ExecutorService executor = Executors.newFixedThreadPool(30); 


    ServerSocket server; 

    try { 

     server = new ServerSocket(5555); 
     System.out.println("Server gestartet!"); 


     while(true){ 


      try { 

       Socket client = server.accept(); 

       //Thread t = new Thread(new Handler(client)); 
       //t.start(); 

       executor.execute(new Handler(client)); 


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


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

Handler (Сервер создает каждый раз, когда экземпляр, когда новый клиент присоединяется):

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Handler implements Runnable { 

private Socket client; 

public Handler(Socket client) { 
    this.client = client; 
} 

@Override 
public void run() { 
    try{ 
     //Streams 
     OutputStream out = client.getOutputStream(); 
     PrintWriter writer = new PrintWriter(out); 

     InputStream in = client.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     // ------------------------------ 

     String s = null; 

     while((s = reader.readLine()) != null){ 

      writer.write(s + "\n"); 
      writer.flush(); 
      System.out.println("Empfangen vom Client: " + s); 

     } 

     writer.close(); 
     reader.close(); 
     client.close(); 

    }catch(Exception e){} 
} 
} 

Клиент:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Scanner; 

public class Client { 

public static void main(String[] args) { 
    try { 
     Socket client = new Socket("localhost", 5555); 
     System.out.println("Client gestartet!"); 

     //Streams 
     OutputStream out = client.getOutputStream(); 
     PrintWriter writer = new PrintWriter(out); 

     InputStream in = client.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     // ------------------------------ 

     writer.write("Hallo Server!\n"); 
     writer.flush(); 


     String s = null; 

     while((s = reader.readLine()) != null){ 
      System.out.println("Empfangen vom Server: " + s); 
     } 

     reader.close(); 
     writer.close(); 

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

Мой вопрос теперь: Как сделать сервер на моем компьютере доступным через Интернет? Мой первый thougt было изменить что-то в конструкторе клиентского сокета

Socket client = new Socket("localhost", 5555); 

«локальный», вероятно, означает, что сервер работает на том же компьютере, что и клиент.

Моей целью было бы иметь приложение на моем смартфоне, который подключается через Интернет к моему серверу, который работает на моем ПК. Он должен отправить мое сообщение, которое я ввел.

+0

Если вы хотите, чтобы ваше приложение было доступно в Интернете, это действительно зависит от вашей ОС и настройки сети, как это стало возможным. Этот вопрос лучше подходит для форумов ServerFault или SuperUsers, так как в конце он не столько о коде, сколько настройке сервера. – Cheesebaron

+0

Для клиента вы должны использовать интернет-адрес вашего маршрутизатора. Узнайте, звоните с whatismyip.com с вашего компьютера. Затем настройте маршрутизатор так, чтобы он пересылал входящие запросы на порт 5555 в IP-адрес вашего ПК. – greenapps

+0

Скажите, пожалуйста, как это сделать на маршрутизаторе netgear. –

ответ

0
  1. Получите ваш публичный IP-адрес с помощью http://whatismyip.com

  2. изменить код клиента Socket client = new Socket("<replace_with_your_public_ip>", 5555);

  3. Убедитесь, что клиент имеет право открыть исходящие соединения на порт 5555 (это, как правило, в случае, если подключен в Wifi, но не если вы используете 3G/4G)

  4. Настройте маршрутизатор, к которому подключен ваш сервер, чтобы он перенаправлял входящие соединения нс из Интернета на порт 5555 на IP-адрес вашего сервера в локальной сети (все еще на порту 5555). Такие настройки обычно можно найти в разделе «NAT» в консоли администратора маршрутизатора (обычно доступной через http://192.168.0.1 или http://192.168.1.1 в зависимости от модели маршрутизатора).

+0

Не могли бы вы объяснить шаги 3 и 4 более точными, потому что я их не понимаю. –

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