Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Клиент - сервер


Автор: Samotnik 1.10.2007, 18:00
Нуно написать прогу, "Клиент - сервер" с  ипользованием БД. Значицца JDBC знаю хорошо (с этим проблем не будет). Но вот проблема с "клиент - сервером", не понимаю, как следует организовать работу.  Нуно сделать что то типа: Клиент (имеет GUI  интерфейс) посылает запрос на сервер, тот в сою очередь берет данные из БД и отсылает назад. Ток как это реализовать - понятия не имею!!!
Хотелось бы чтоб подсказали, каким образом, серверу (кот берет данные из БД) передать эти данные клиенту, и отобразить в красивой Свинговской таблице?!?!?!?  smile 
Если не сложно, выложите плз пример кода, кот демонстрирует, простейший обмен между клиентом и сервером в GUI интерфейсе !!!

Автор: nornad 2.10.2007, 02:25
У тебя простая клиент-серверная модель? Тогда всё просто. Клиентская часть всё рисует и даёт изменять, а данные берёт и кладёт через обращение к серверу. Серверная часть тупо сидит и ждёт, чего ей прикажут. Приказали выдать некие данные - лезет в БД и выдаёт. Приказали записать - пишет.
Общение между двумя частями реализовать можно по-разному. Тут тебе и сокеты, и пайпы, и флопинет, и соап, и много чего ещё можно придумать. Даже тупо через работу с файлом можно реализовать. smile
Выбор обычно либо заранее определяется требованиями заказчика, либо производится исходя из имеющихся возможностей и знаний.

Добавлено через 1 минуту и 14 секунд
Инициатор общения в 99% - клиент (изредка требуется реализовать возможность синхронизации неких кешируемых данных на различных клиентах - тогда инициатором выступает сервер).

Автор: Samotnik 2.10.2007, 11:19
Цитата(nornad @  2.10.2007,  02:25 Найти цитируемый пост)
 Тут тебе и сокеты

А на этом если можно по-подробнее  .
Я се так представляю: Сервер берет данные из базы, записывает в одну переменную (с разделителями), пересылает на клиент, тот в свою очередь через StringTokenizer разделяет  обратно и записывает в JTable .    Так??  Иль схема иная???

Автор: nornad 2.10.2007, 11:39
С сокетами я ни разу не работал, поэтому ничего про них не скажу.
А вот по поводу пересылки - да, приведённый тобою вариант является одним из возможных. Я бы только все значения сначала прогнал через base64, чтобы в них не встречалось тех же разделителей и других потенциально опасных символов.

Автор: Samotnik 2.10.2007, 12:11
Цитата(nornad @  2.10.2007,  11:39 Найти цитируемый пост)
тобы в них не встречалось тех же разделителей и других потенциально опасных символов.

База будет простенькая  (4 сущности, и 1 с экономическими расчетами), поэтому, разделителей там не будет, это я "вручную" проматрю.

Цитата(nornad @  2.10.2007,  11:39 Найти цитируемый пост)
С сокетами я ни разу не работал, поэтому ничего про них не скажу.А вот по поводу пересылки - да

 smile    Пасибо и на этом!!!!

Автор: _Michael 2.10.2007, 21:26
так там нет ничего сложного с сокетами. на сервере создаеш ServerSocket. а на клиенте просто Socket и все. Вот куски кода клиента. уже их повставляеш куда надо и как будет угодно
Код

int port = 3339; //порт на котором у тебя сервер работать будет
            InetAddress addr = InetAddress.getByName(host); //имя хоста куда хочешь конектиться т-е где сервер запущен
            Socket sock = new Socket(addr, port);
            InputStream in = this.sock.getInputStream();
            OutputStream out = this.sock.getOutputStream();
 Вот ети InputStream и OutputStream используеш соответственно для чтения и записи в сокет что означает получения ответа сервера (чтение) и запрос серверу(запись). там где то в потоке окремом пишешь что-то наподобе
Код

//ето все упрощено конечно.
while (true) {
.....
int available = sock.getInputStream.available();
byte[] data = sock.getInputStream.read(available);
....
}

аналогично используеш out  для записи в сокет.
С серверСокетом думаю проблем не будет. аналогично как с клиентским, только хоста не надо указывать, просто
Код

 ServerSocket ss = new ServerSocket(3339); 
точно не помню. както так smile

Автор: Samotnik 3.10.2007, 00:15
А с многопоточностью, как быть? (Много клиентов типа должно быть !)

Автор: _Michael 3.10.2007, 09:27
ну ето не знаю. ты сначала реализуй для одного клиента чтоб работало корректно. А потом запусти два или три клиента одновременно посмотри что будет. и уже потом будем разбираться. smile. Не все сразу smile

Автор: Maverick 3.10.2007, 12:37
а на фига это все вручную писать? 21 век на дворе... существуют веб-сервера, сервлет- ежб- контейнеры... ?? зачем писать все на таком низком уровне???

Автор: Samotnik 3.10.2007, 12:49
Цитата(Maverick @  3.10.2007,  12:37 Найти цитируемый пост)
а на фига это все вручную писать? 21 век на дворе... существуют веб-сервера, сервлет- ежб- контейнеры... ?? зачем писать все на таком низком уровне???

Потому что задание такое!!!    smile 

Автор: _Michael 3.10.2007, 13:08
smile потому что так интересней, и дает более глубокое понимае как работают ети высокоуровневые технологии

Автор: v2v 3.10.2007, 14:50
всё просто. недавно такое же задание делал )))
значиццо так:
заходишь в Ява Альманах и смотришь 4 примера: 
1) http://www.exampledepot.com/egs/java.net/CreateServerSocket.html
2) http://www.exampledepot.com/egs/java.net/CreateClientSocket.html?l=rel
3) http://www.exampledepot.com/egs/java.net/ReadFromSocket.html?l=rel
4) http://www.exampledepot.com/egs/java.net/WriteTextToSocket.html?l=rel
Многопоточность тебе надо будет делать в примере 1.
Вот так: 
Код

    try {
        int port = 2000;
        ServerSocket srv = new ServerSocket(port);
    
        // Wait for connection from client.
        WORKWITHKLIENT(srv.accept()); // -------- вот тут для каждого сокета создаешь отдельный поток!!!
    } catch (IOException e) {
    }


В функции WORKWITHKLIENT реализовываешь примеры 3 и 4. Вот и всё))

Автор: _Michael 3.10.2007, 18:09
v2v, отличный пример smile 

Автор: v2v 3.10.2007, 21:36
_Michael,  это можно отмечать в репутации  smile 

Автор: jsse 7.10.2007, 23:41
Можно сделать client-server на http://ws.apache.org/xmlrpc/, многопоточность, простота использования. Но простота жертвуется производительностью, т.к. для отправки запроса и получения ответа формируется xml документ который занимает 80% ответа. При небольшом объеме обмена данных и скоростном соединении это не ощущается.

Работает просто - клиент вызывает ф-цию на сервере и получает ответ.

// SERVER
Код

// SERVER
          WebServer webServer = new WebServer(port);
        
          XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
          PropertyHandlerMapping phm = new PropertyHandlerMapping();

// Класс у которого будут вызывать ф-ции
          Calculator = org.apache.xmlrpc.demo.Calculator org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl
          phm.addHandler("Calculator", org.apache.xmlrpc.demo.Calculator.class);

          xmlRpcServer.setHandlerMapping(phm);

          XmlRpcServerConfigImpl serverConfig =
              (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
          serverConfig.setEnabledForExtensions(true);
          serverConfig.setContentLengthOptional(false);

          webServer.start();


Код

//CLIENT
          XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
          config.setServerURL(new URL("http://127.0.0.1:8080/xmlrpc"));
          config.setEnabledForExtensions(true);  
          config.setConnectionTimeout(60 * 1000);
          config.setReplyTimeout(60 * 1000);
          XmlRpcClient client = new XmlRpcClient();
          client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
          client.setConfig(config);
          Object[] params = new Object[] { new Integer(2), new Integer(3) };
// Вызов ф-ции у сервера
          Integer result = (Integer) client.execute("Calculator.add", params);
          System.out.println("2 + 3 = " + result);


В качестве аргумента можно передавать как простые типы так и массивы, HashMap.

Автор: dotSquid 3.12.2007, 23:42
Юзаю этот apache xmlrpc, но сервер какой-то однозадачный. Если одновременно обращаются два клиента, то обслуживаются они последовательно. Как лечить?

Автор: dotSquid 4.12.2007, 22:01
Товарищи, очень прошу помощи. В этой теме разбираюсь плохо, и разбираться в сути времени нет, а нужно скоро сдавать проект.

Автор: LSD 5.12.2007, 13:53
Судя по всему xml-rpc поддерживает многопоточность. Твои методы нигде не используют synchronized?

Автор: dotSquid 5.12.2007, 20:47
Убейте меня ржавой консервной банкой, действительно, тупанул с synchronized. Огромное спасибо за то, что открыл глаза

Автор: CrasyMen 25.4.2009, 21:38
Samotnik, поделись исходником, плз. Буду премного благодарен. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)