2015-09-21 12 views
2

Я пытаюсь сделать клиентский пульт для java-программы, я прочитал о сокетах, но, похоже, есть несколько протоколов и способов сделать это.Каков самый простой способ сделать локальный пульт для java-программы?

В основном я хотел бы просто нажать кнопку на клиентской части приложения и активировать связанные функции на серверной части в локальном режиме.

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

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

+0

Посмотрите на этот вопрос и ссылку в этом вопросе: http://stackoverflow.com/questions/33106127/swift-socket-readline-writeline/33106252#33106252 & http://cs.lmu.edu/~ ray/notes/javanetexamples/ –

+0

Эта ссылка была бы более понятной: http://stackoverflow.com/questions/32486607/java-socket-remote-desktop-connection/32487098#32487098 –

ответ

0

Ну,

на самом деле реализации на стороне клиентской программы и на стороне сервера программы :)

для того, чтобы это понять, вам нужно кое-какую информацию об основах программирования на стороне сервера. Позволяет взять базовый веб-сервер приложений. Apache tomcat. Вы сделаете свой фронт (gui и т. Д.), Как вы этого хотите, допустим, что вы нажимаете кнопку, которая говорит «нажмите меня, и я скажу привет!»

Когда мы нажимаем эту кнопку, вам нужно будет запустить функцию (если это веб-приложение, это будет в Javascript), который отправит сообщение или «запрос» на сервер. Сервер получает этот запрос, обрабатывает его и отправляет «ответ», содержащий данные.

В рамках веб-проекта java вы указываете определенные URL-адреса, такие как www.example.com/hello, на определенные классы, содержащие код (сервлеты или конечные точки). обычно вы также прикрепляете части данных к вашему «запросу», чтобы сервер мог что-то сделать.

В качестве примера возьмем регистрационную форму. вы бы сделали несколько полей ввода, и когда мы нажимаем на отправку данных из этих полей, они присоединяются к запросу и отправляются на сервер. на стороне сервера мы получим объект запроса (например, javax.servlet.httpservletrequest). из этого объекта мы можем открыть поток данных и прочитать прикрепленные к нему данные.

нормально (без помощи рамок или библиотек JSON) можно было бы сделать:

InputStream inputStream = request.getInputStream(); 
     if (inputStream != null) { 
      bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      char[] charBuffer = new char[128]; 
      int bytesRead = -1; 
      while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
       stringBuilder.append(charBuffer, 0, bytesRead); 
      } 

как только вы получите данные, сделать что-то с ним, а затем отправить ответ через объект HTTPResponse. это основная часть серверных вычислений. Это намного больше, например, отправка асинхронных запросов на сервер. Используя объектные обозначения, чтобы облегчить чтение из запросов, используйте REST для легкого доступа к данным из нас.

, но для начала попробуйте начать с простого проекта tomcat и посмотрите на сервлеты, отображения сервлетов ec.

+0

Большое спасибо, мне нужно копать это, ваше объяснение делает вещи более ясными. – javaNoob49854

+0

Хотя это дает мне некоторое представление о программировании клиента/сервера, мне трудно найти способ применить это к моему конкретному случаю.Прежде всего, я не понимаю, почему я должен использовать URL-адреса для отправки данных из программы в другую локальным параметром вместо IP-адресов, тогда я все еще не уверен, что открыть в каком порядке на сервере и клиенте, или нет, это должно быть сделано в отдельном потоке (при отсутствии ввода прерыватель не должен оставаться бездействующим); – javaNoob49854

+0

, кроме того, о проекте tomcat/apache, я действительно не уверен в том, что я откажусь от java, чтобы попробовать что-то в среде, в которой я еще менее знаком, чтобы достичь чего-то, что я, вероятно, тогда не смогу воспроизвести в java, - лучший способ я продолжаю. – javaNoob49854

2

Очень простой способ позволить двум Java-приложениям (серверу и клиенту) разговаривать друг с другом, особенно на том же компьютере, использовать Remote Method Invocation (RMI). RMI позволяет обмениваться объектами между Java-приложениями, что означает, что это очень высокий уровень абстракции связи и устраняет необходимость писать пользовательский сетевой код или обрабатывать задействованный параллелизм.

Вот очень простой пример:

Шаг 1: Создание общего интерфейса

Создать общий интерфейс, который описывает функциональные возможности, предоставляемые го сервера:

package com.example.remote; 

import java.io.Serializable; 
import java.rmi.Remote; 
import java.rmi.RemoteException; 

public interface RemoteControlInterface extends Remote, Serializable { 

    public void sendCommand(String command) throws RemoteException; 

} 

Этот интерфейс должен расширять java.rmi.Remote и java.io.Serializable, и каждый метр должен быть способен выбросить java.rmi.RemoteException. Поместите это в библиотеку и используйте эту библиотеку как на сервере, так и на клиенте. Как это делается, зависит от используемой среды IDE. Самый простой способ - разместить сервер, клиент и общую библиотеку в одном проекте.

Шаг 2: Создание приложения сервера

Создать реализацию общего интерфейса приложения сервера:

package com.example.remote.server; 

import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

import com.example.remote.RemoteControlInterface; 

public class RemoteControl extends UnicastRemoteObject implements RemoteControlInterface { 

    private static final long serialVersionUID = 1L; 

    protected RemoteControl() throws RemoteException { 
    } 

    @Override 
    public void sendCommand(String command) throws RemoteException { 
     System.out.println("remote control asked for " + command); 
    } 

} 

Осуществление общего интерфейса должно распространяться java.rmi.server.UnicastRemoteObject.

Создайте фактическое серверное приложение, которое публикует экземпляр реализации RemoteControlInterface как remoteControl в качестве сервера, который прослушивает порт 1234.

package com.example.remote.server; 

import java.net.MalformedURLException; 
import java.rmi.AlreadyBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 

public class Server { 

    public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { 
     Registry registry = LocateRegistry.createRegistry(1234); 
     registry.bind("remoteControl", new RemoteControl()); 
    } 

} 

Шаг 3: Создание клиентского приложения

Создать фактическое клиентское приложение, которое подключается к серверу на порт 1234 и извлекающий опубликованный экземпляр RemoteControlInterface, используя имя remoteControl.

package com.example.remote.client; 

import java.rmi.AccessException; 
import java.rmi.NotBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 

import com.example.remote.RemoteControlInterface; 

public class Client { 

    public static void main(String[] args) throws AccessException, RemoteException, NotBoundException { 
     Registry registry = LocateRegistry.getRegistry(1234); 
     RemoteControlInterface greetingService = (RemoteControlInterface) registry.lookup("remoteControl"); 
     greetingService.sendCommand("helloWorld"); 
    } 

} 

Это заставит сервер приложений для печати remote control asked for helloWorld на своей консоли.

параметры и возвращаемое значение из всех методов в общий интерфейс может быть:

  • Любой примитивный тип Java (булево, INT, ...)
  • Любой класс, доля оба приложения (String , Date, ...), который реализует java.io.Serializable, если оба приложения имеют одну и ту же версию соответствующего файла класса. Письмо верно для всех классов, предоставляемых JRE, и всех классов, помещенных в общую библиотеку.

Хотя RMI может сделать гораздо больше, этого должно быть достаточно для реализации простого пульта дистанционного управления.