Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 23.02.2010
Сообщений: 8

Организация сетевого приложения на Java

18.05.2010, 00:47. Показов 2951. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Требуется создать систему тестирования.
Имеется серверное приложение, работающее с БД (MySQL), которое отвечает на запросы
Отдать список вопросов,
Получить результаты.
Имеется клиент. Который посылает эти запросы и получает ответы в виде XML файла с вопросами и результаты тестирования.
Формат вопросов и ответов - XML.
Имеются методы создания и парсинга XML документов.

Я написал сервер который на каждое подключение создает поток, и когда к нему подключаються отдает список вопросов. Работа идет через сокеты (Input&Output stream).
Server

Java
1
2
getTest(how,"Java", socket.getOutputStream());
            socket.getOutputStream().close();
Client
Java
1
2
3
4
5
6
7
8
9
final Socket s = new Socket(HOST, PORT);
InputStream in = s.getInputStream();
FileOutputStream outFile = new FileOutputStream("myxml.xml");
                    byte buff[] = new byte[1024];
                    int len;
                    while((len=in.read(buff))>0)
                        outFile.write(buff, 0, len);
                    outFile.close();
                    qustions = Read(new FileInputStream("myxml.xml"));
Я недавно пишу на Java не могу точно спроектировать как посылать разные запросы.
Т.е. К серверу подключились попросили вопросы, потом как-то надо передать ответы, и тебе должны вернуть результаты... может надо посылать тип запроса например сначала "getQ" и ждать вопросов... но как это организовать?
Простите, вопрос звучит может быть глупо, но с сетью я работал только на php и совсем чуть на C++. И обработку разных запросов представить сложно.
Пытался найти примеры, но везде приводятся простые клиент-сервенные "echo" приложения.
Буду очень благодарен за любые наводки.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2010, 00:47
Ответы с готовыми решениями:

Организация сетевого приложения, в основе которого БД MS SQL
Доброго времени суток, вопрос такой мне нужно написать базу данных которая будет работать в сети на C# она будет шифроваться будут...

Организация сетевого шутера
Всем привет! Вопрос возник следующий: как грамотнее реализовать перемещение и стрельбу игроков на сервере? Есть идея сделать это...

Организация прямого сетевого взаимодействия между устройствами
Здравствуйте. Сабж. Например для медиа связи. Учитывая, что адреса у мобильных устройств динамические и меняются каждую сессию, то...

4
 Аватар для RZ_RZ
263 / 19 / 3
Регистрация: 26.05.2006
Сообщений: 150
18.05.2010, 12:26
Для начала можно придумать протокол. Например 0 будет означать, что клиент запрашивает вопросы, 1 будет означать, что клиент посылает тестовые ответы и ожидает в качестве ответа от сервера результаты.

Вот прмерный сервер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ServerSocket socket = new ServerSocket( port );
while ( true )
{
    serve( socket.accept() );
}
...
public void serve( Socket socket )
{
    BufferedInputStream in = new BufferedInputStream( socket.getInputStream() );
    int cmd = in.read();
    if ( cmd == 0 ) // отдать вопросы
    {
        String questionsXML = ...
        PrintWriter out = new PrintWriter( new BufferedOutputStream( socket.getOutputStream() ) );
        out.write( questionsXML );
        out.flush();
    }
    else if ( cmd == 1 ) // сформировать результаты
    {
        // прочитать ответы тестируемого
        ...  in.read(...) ...
        // отдать результаты тестирования
        String resultsXML = ...
        PrintWriter out = new PrintWriter( new BufferedOutputStream( socket.getOutputStream() ) );
        out.write( resultsXML );
        out.flush();
    }
}
Сделайте еще try ... finally для закрытия сокета

Добавлено через 10 минут
Ну а клиент будет инициировать соединение и слать первым байтом 0 или 1, если 1 то за ней еще и ответы пользователя.

Вот примерная процедура отправки ответов пользователя:
Java
1
2
3
4
5
6
7
8
9
10
Socket s = new Socket( ip, port );
// Отправим запрос
BufferedOutputStream out = new BufferedOutputStream( s.getOutputStream() );
out.write( 1 );
out.write( ... тут ответы пользователя ... );
 
// Получим ответ
BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
 
... while ... in.read(...)...тут както показать результаты пользователю...
Както так...
1
0 / 0 / 0
Регистрация: 23.02.2010
Сообщений: 8
18.05.2010, 14:11  [ТС]
Спасибо большое!
Я сделал как вы советовали, отправка вопросов работала, потом я видимо не так изминил, теперь не работает ничего...
Ладно. Сейчас в метро исправлю.
Но у меня была проблема.
Дело в том, что обработчик кнопки может вызывать только static методы. И когда я из него вызываю SendAnswer() - в котором вызывается out.write он вызывает NullPointer исключение... не подскажете как с этим бороться, или как еще можно вызвать отправку данных по нажатию кнопки?
Еще раз спасибо за скорый и полный ответ, честно говоря я не ожидал
0
 Аватар для RZ_RZ
263 / 19 / 3
Регистрация: 26.05.2006
Сообщений: 150
18.05.2010, 14:37
Если у вас NPE то ищите его причину, пользуйтесь дебагом, смотрите, почему out вдруг стал null.
А по поводу нажатий, ну надо на кнопку повесить слушатель
Java
1
myButton.addActionListener(...)
, а в слушателе в actionPerformed(...) реализовать действие по клику. Помоему както так там (в свинге) делается.
0
0 / 0 / 0
Регистрация: 23.02.2010
Сообщений: 8
19.05.2010, 23:20  [ТС]
Да. Конечно. Я через actionPerformed и делал. Вроде разрешилось... он не как не хочет отдавать результаты.
Выглядит это так:
Server Отправляет результаты:
Java
1
2
sendResult(good,how,socket.getOutputStream());
socket.getOutputStream().close();
PrintWriter не использую уже - чтоб напрямую и всякую ошибку исключить. Или я не прав?

А Client получает так

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
InputStream in = s.getInputStream(); //Входная инфа
        FileOutputStream resFile = new FileOutputStream("result.xml"); //Пишем ответы в файл
        System.out.println("Создали файл в который читать");
        byte mybuff[] = new byte[1024];
        int len;
        while((len=in.read(mybuff))>0)
        {
                System.out.println("Прочли: "+mybuff);
            resFile.write(mybuff, 0, len);
        }
        resFile.close();
            System.out.println("Создан файл с вопросами...");           
        readResult(new FileInputStream("result.xml"));
        System.out.println("прочитал результат");
        in.close();
Да. Использую файл как буфер - чтоб уж наверняка читалось. Но! В файл ничего не записывается.
До этого кода в клиенте есть код

Java
1
2
3
4
5
6
7
8
s = new Socket(HOST, PORT);     //Создаем клиентский сокет
        PrintWriter out = new PrintWriter(new BufferedOutputStream(s.getOutputStream()));
        
        out.write(1);
        out.flush();
        Write(answers, out);
        out.flush();
        out.close();
для отправки ответов и получения результатов.
Но если остается out.close(); - то он при вызове
InputStream in = s.getInputStream();
Выдает исключение


java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at area.Client.sendEnd(Client.java:410)
at area.Client$1$1.actionPerformed(Client.j ava:150)
at javax.swing.AbstractButton.fireActionPer formed(Unknown Source)
at javax.swing.AbstractButton$Handler.actio nPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActio nPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPresse d(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListen er.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unk nown Source)
at javax.swing.JComponent.processMouseEvent (Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unk nown Source)
at java.awt.Container.dispatchEventImpl(Unk nown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetM ouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMo useEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchE vent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unk nown Source)
at java.awt.Window.dispatchEventImpl(Unknow n Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknow n Source)
at java.awt.EventDispatchThread.pumpOneEven tForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsF orFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsF orHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents( Unknown Source)
at java.awt.EventDispatchThread.pumpEvents( Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Если же нет закрытия PrintWriter out - то он не перестает читать... вобщем делема и жуть. уже день с переменными подходами пытаюсь разрешить эту проблему...
Может у Вас есть идеи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2010, 23:20
Помогаю со студенческими работами здесь

Организация сетевого хранилища с возможностью работать с ним из Проводника
Всем привет. Давно мечтаю о сетевом хранилище... да, собственно, оно у меня уже и есть. Из старенького компа собрал, к сети подключил -...

БД не сетевого приложения
Здравствуйте. Я новичок в Java и уже хочется что-то полезное сделать. Хочу сделать приложение для одного ПК в котором будет подобие excel....

Серверная часть сетевого приложения на C++
Доброго времени суток. Решил создать небольшое сетевое приложение, и возник вопрос следующего содержания. ...

Построение логики сетевого приложения
Собственно у меня такой вопрос... предположим я хочу написать некое приложение для сети, что то в стиле игры (для тренировке)... то...

Нужен совет по организации сетевого приложения
Добрый день. Прошу не конкретных решений, а так сказать вектор - куда копать ) Проект так сказать, ради "спортивного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru