Реализация игры pong на языке Java с помощью технологии Socket

Автор работы: Пользователь скрыл имя, 07 Ноября 2014 в 18:50, курсовая работа

Краткое описание

Цель работы:
Написать игру пинг-понг на языке Java с используя технологию сокетов.
Для достижения этой цели были поставлены следующие задачи:
1. Рассмотреть сетевые возможности разных языков программирования;
2. Изучить работу с графикой на Java;

Содержание

Оглавление 2
Введение 3
Глава 1. Сетевые возможности разных языков программирования 3
1.1. Сетевое программирование в C# 3
1.2. Сетевое программирование в Python 3
1.3. Сетевое программирование в Perl 3
1.4. Графика в Java 3
1.5. Аплеты в Java 3
Глава 2. Разработка программы 3
2.1. Программирование сокетов 3
2.2.Проектирование и реализация 3
Заключение 3

Прикрепленные файлы: 1 файл

Курсовая ..docx

— 182.63 Кб (Скачать документ)

 

 

Министерство обрaзовaния и нaуки Российской Федерации

Федерaльное госудaрственное бюджетное обрaзовaтельное учреждение 
высшего профессионального обрaзовaния

«Оренбургский государственный педагогический университет»

Физико-мaтемaтический факультет

Кaфедрa информaтики и методики преподaвaния информaтики


 

Мищенко Сергей Геннадьевич

Курсовая рaботa

Реализация игры pong на языке Java с помощью технологии Socket

 

Специальность: 010503.65 Мaтемaтическое обеспечение и aдминистрировaние информaционных систем

Форма обучения: дневная

 

 

Научный руководитель:

Ст. преподaвaтель Гaрмaш М.И.

   

(оценка)

(подпись)

«___» ___________ 201_ г.


 

 

 

 

Оренбург 2013

Оглавление

 

 

 

Введение

Использование локального программирования на Java широко распространено. На основе технологий Java работают приставки, принтеры, веб-камеры, игры, навигационные системы для автомобилей, терминалы для проведения лотерей, медицинские устройства, автоматы для оплаты парковки и многое другое. Но со временем локальное программирование все чаще вытесняется сетевым программированием. Это на данный момент очень актуально, и я решил показать это на примере реализации сетевой игры пинг-понг.

Цель работы:

Написать игру пинг-понг на языке Java с используя технологию сокетов.

Для достижения этой цели были поставлены следующие задачи:

1. Рассмотреть сетевые возможности разных языков программирования;

2. Изучить работу с графикой на Java;

3. Рассмотреть возможности использования Java-апплетов;

4. Продемонстрировать работу с сокетами;

5. Реализовать программу.  
Глава 1. Сетевые возможности разных языков программирования

1.1. Сетевое программирование в C#

Среда .NET предоставляет два пространства имен: System.Net и System.Net.Sockets для работы с сетью. Эти пространства имен содержат классы и методы, которые позволяют легко создавать программы, которые могут взаимодействовать через сеть 
Взаимодействие может осуществляться как с постоянным подключением по сети, так и без него. Также можно работать как с потокоориентированными данными так и с датаграммами. Наиболее распростанены протоколы TCP (использует потокоориентированное подключение) и UDP (приложения, ориентированные на датаграммы).

Класс System.Net.Sockets.Socket - это основной класс из пространства имен System.Net.Sockets. Экземпляр класса Socket имеет локальную и удаленную точку подключения, через которые он работает. Локальная точка подключения содержит информацию о подключении текущего состояния сокета. 
          Также существует несколько вспомогательных классов, таких как IPEndPoint, IPAdress, SocketException и др., которые используют при создании сетевых программ. Среда .NET поддерживает синхронное и асинхронное подключения между клиентом и сервером. Для этих двух типов взаимодействия по сети используются различные методы.

Синхронное подключение работает в блочном режиме, в котором метод ожидает завершения операции перед возвратом значения. А вот асинхронное подключение работает в неблочном режиме, при котором значение возвращается сразу, даже если операция взаимодействия не окончена. 
          Пространство имен System.Net предоставляет класс Dns, с помощью которого можно создавать и посылать запросы для получения информации о хосте сервера через Службу Доменных Имен Интернета (Internet Domain Name Service)

IPHostEntry класс

Этот класс является контейнером для информации о адресах хостов Интернета. Он не содержит гарантий потокобезопасности. Ниже описаны  наиболее интересные члены этого класса.

IPEndPoint класс

Этот класс реализует абстрактных класс EndPoint. IPEndPoint класс представляет собой сетевую точку как IP адрес и номер порта.

1.2. Сетевое программирование в Python

Большинство необходимых вам функций обеспечивается тремя модулями: HTTPLIB, URLLIB и новым дополнением, XMLRPCLIB. В истинно Питоновском стиле каждый модуль надстроен над своим предшественником, обеспечивая таким образом прочную, хорошо спроектированную базу для ваших приложений.

HTTPLIB

HTTPLIB представляет собой простую  обертку вокруг модуля socket. Из трех упомянутых библиотек, HTTPLIB обеспечивает наибольший контроль при обращении к web-сайту. Это дается за счет увеличения объема работы, необходимого для выполнения задачи. Протокол http не имеет текущего состояния ("stateless") и поэтому ничего не помнит о ваших предыдущих запросах. При соединении с Web-сайтом для каждого запроса нужно построить новый объект HTTPLIB. Эти запросы образуют диалог с Web-сервером, подражая Web-браузеру. Диалог начинается с построения серии предложений, определяющих сначала, какое действие вы хотите предпринять, а затем идентифицирующее вас для Web-сервера:

import httplib

host = 'www.oreillynet.com'

h = httplib.HTTP(host)

h.putrequest('GET', '/meerkat/?_fl=minimal')

h.putheader('Host', host)

h.putheader('User-agent', 'python-httplib')

h.endheaders()

Запрос GET сообщает серверу, какую страницу вы хотите получить. Заголовок Host сообщает ему имя запрашиваемого вами домена. Современные сервера, использующие HTTP 1.1, могут иметь несколько доменов по одному и тому же адресу. Если вы не говорите им, какой домен вам нужен, в качестве кода возврата вы получите код переадресации '302'. Заголовок User-agent сообщает серверу, к какому типу клиента вы относитесь, чтобы знать, что он может вам посылать, а что нет. Это вся информация, необходимая для обработки запроса Web-сервером. Далее запрашиваем ответ:

 returncode, returnmsg, headers = h.getreply()

if returncode == 200: #OK

f = h.getfile()

print f.read()

В результате этого будет распечатана текущая страница Meerkat в минимальном виде. Заголовок отклика и содержимое возвращаются отдельно друг от друга, что помогает как в определении и устранении проблем, так и в разборе данных. Если хотим увидеть заголовки отклика, нужно использовать print headers.

HTTPLIB скрывает механику программирования  сокетов, и использование им файлового  объекта для буферизации позволяет применять привычный подход к манипуляции данными. HTTPLIB оснащен полезной возможностью отладки. Доступ к ней получаем, вызывая метод h.set_debuglevel(1) в любой момент после инициализации объекта (строка h = httplib.HTTP(host) в нашем примере). С уровнем отладки 1, модуль будет дублировать на экран запросы и результаты любых обращений к getreply().

URLLIB

URLLIB обеспечивает изощренный интерфейс  к функциональности HTTPLIB. Лучше всего  использовать его непосредственно  для получения данных, а не  для анализа Web-сайта. Здесь представлено  то же взаимодействие, что и  выше, но с использованием URLLIB:

import urllib

u=urllib.urlopen('http://www.oreillynet.com/meerkat/?_fl=minimal')

Одной строкой вы обратились к Meerkat, получили данные и поместили их во временный кэш. Для доступа к заголовку:

print u.headers

И для просмотра всего файла:

print u.read()

Но это еще не все. В дополнение к HTTP, URLLIB может таким же образом обращаться к FTP, Gopher и даже к локальным файлам. Модуль содержит также множество вспомогательных функций, включая те, что используются для разбора url, кодирования строк в url-безопасный формат и обеспечения индикации хода процесса во время пересылки большого объема данных.

1.3. Сетевое программирование  в Perl

В Perl используется стандартный и одинаковый для всех СУБД механизм DBI. Perl изначально предлагал намного более богатый список модулей-расширений, работающий с самыми разными библиотеками, и то, что не так давно появилось в PHP, было в Perl уже годы назад. Perl даже можно использовать в более тесной интеграции с веб-сервером apache как модуль mod_perl, точно также как это делается для PHP через модуль apache mod_php.

AddHandler cgi-script .pl

Первый и простой скрипт из документации

Создайте файл test.pl следующего содержимого:

use strict;

use CGI;   # or any other CGI:: form handler/decoder

use CGI::Ajax;

my $cgi = new CGI;

my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

print $pjx->build_html( $cgi, \&Show_HTML);

sub perl_func {

  my $input = shift;

  # do something with $input

  my $output = $input . " was the input!";

  return( $output );

}

sub Show_HTML {

  my $html = <<EOHTML;

           <HTML>

           <BODY>

             Enter something:

               <input type="text" name="val1" id="val1"

               onkeyup="exported_func( ['val1'], ['resultdiv'] );">

             <br>

             <div id="resultdiv"></div>

           </BODY>

           </HTML>

EOHTML

return $html;

}

Итак:

use strict;

use CGI; # or any other CGI:: form handler/decoder

use CGI::Ajax;

Первая строка устанавливает "строгий" или "ограниченный" режим функционирования скрипта на Perl. В этом режиме должно чётко соблюдаться объявление локальных и глобальных переменных. В принципе, мы могли бы и не использовать такой режим, но часто его использование позволяет избежать путаницы, когда переменная с одним и тем же именем начинает использоваться глобально и в какой-либо функции. Вторая и третья строки подключают модули для работы CGI и CGI::Ajax. Модуль CGI берёт на себя всю работу по инцициализации веб-окружения и переданных веб-серверу параметров, позволяя также выдавать и редактировать служебные и http-заголовки, куки и параметры POST и GET запросов. Модуль CGI::Ajax ещё и добавляет при этом возможность работы с AJAX

my $cgi = new CGI;

my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

print $pjx->build_html( $cgi, \&Show_HTML);

Здесь в первых 2-х строках мы создаём экземляры переменных классов CGI и CGI::Ajax. В момент создания происходит их инициализации и задание неких начальных параметров. Для CGI::Ajax мы видим, что создаётся привязка JavaScript функции exported_func к функции Perl'а perl_func. И наконец, в 3-й строке происходит вызов метода класса CGI::Ajax с именем build_html, который предназначен для вывода HTML содержимого веб-странички. В качестве параметров передаются переменная класса CGI и ссылка на имя функции, которая собственно и отрисовывает веб-страницу.

sub perl_func {

  my $input = shift;

  # do something with $input

  my $output = $input . " was the input!";

  return( $output );

}

Это та самая функция на языке Perl, которая будет вызвана при вводе какого-либо значения в поле ввода. Эта функция будет вызвана как отдельный CGI-скрипт. Т.е. данная функция совершенно независмый скрипт внутри основного скрипта. Сама же функция принимает аргумент и добавляет к нему строку "was the input!", после чего возвращает полученную в итоге строку

sub Show_HTML {

  my $html = <<EOHTML;

           <HTML>

           <BODY>

             Enter something:

               <input type="text" name="val1" id="val1"

                onkeyup="exported_func( ['val1'], ['resultdiv'] );">

             <br>

             <div id="resultdiv"></div>

           </BODY>

           </HTML>

EOHTML

return $html;

}

Это функция, которая отрисовывает содержимое веб-странички. Функция выводит всего два видимых элемента: поле ввода с именем val1 и что более важно с таким же id, а также область (div), с id="resultdiv", в которой и будут отображаться результаты ввода и работы функции perl_func.

onkeyup="exported_func( ['val1'], ['resultdiv'] );">

В этой строке, для поля ввода val1 назначается обработчик события, возникающего при отпускании нажатой клавиши на клавиатуре - onkeyup. Такое назначение является работой языка JavaScript, поддержка которого встроена во все современные браузеры, ведь сам HTML - это только язык разметки текста, не более. Далее, функции передаются два аргумента в квадратных скобках и одинарных кавычках. Первый аргумент - это id того элемента, событие которого будет обрабатывать функция, а второй - id элемента, в который будет помещён полученный в результате работы результат. Например мы вводим в поле ввода с клавиатуры цифру 1. Когда мы отпускаем кнопку с цифрой 1, случается событие onkeyup, которое подхватывается JavaScript, который далее передаёт управление функции exported_func. Данная функция, код которой автоматически генерируется CGI::Ajax, в свою очередь выполняет AJAX запрос, в результате которого выполняется функция perl_func и возвращённый ей результат, функция exported_func размещает в div с id resultdiv.

CGI::Ajax имеет своё мнение о  выводимых заголовках, касаемо кодировки. Если вы выдали такие заголовки  ранее, то не забудьте отключить  их у CGI::Ajax, добавив после строки:

my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );

строку

$pjx->skip_header(1);

Если необходимо обрабатывать ввод в нескольких элементах ввода, вы можете видоизменить функцию exported_func, добавив аргументы:

onkeyup="exported_func(['val1','val2'], ['resultdiv1','resultdiv2']);"

А если необходимы разные функции-обработчики, добавляем их при создании экземпляра класса CGI::Ajax:

my $pjx = new CGI::Ajax( 'exported_func' =>\&perl_func,

           'exported_func2' =>\&perl_func2);

 

1.4. Графика в Java

Графику в Java обслуживают классы Graphics и Graphics2D. Работа с графикой осуществляется в графическом контексте элементов, унаследованных от класса Component. Понимать это можно так: на элементах управления, например, JFrame, JPanel, JButton и других, есть возможность рисовать. Такие элементы обладают графическим контекстом, в этом контескте мы и рисуем. Всё, что нарисуем в контексте будет показано на элементе. Классы Graphics и Graphics2D нужны для работы с графическим контекстом. Мы должны получить экземпляр такого класса и, используя его методы, рисовать. Получить экземпляр контекста можно в методе paint:

public void paint(Graphics g);

этот метод наследуется из класса Component. Аргумент Graphics g создаётся системой, а мы берём его в готовом виде и используем для рисования. При создании элемента метод paint будет вызван автоматически.

Начнём изучать работу с графикой в Java с класса Graphics.

      public void paint(Graphics g)

  {

          g.drawLine(20, 20, 360, 20);

        Color oldColor = g.getColor();

          Color newColor = new Color(0, 0, 255);

          g.setColor(newColor);

 g.drawLine(20, 30, 360, 30);   

g.setColor(oldColor);

          g.drawRect(20, 40, 340, 20);

         newColor = new Color(0, 215, 255);

          g.setColor(newColor);

         g.fillRect(21, 41, 339, 19);

         g.setColor(oldColor);

          g.drawRoundRect(20, 70, 340, 30, 20, 15);

          g.drawOval(20, 110, 150, 60);

          g.drawOval(200, 110, 60, 60);

          g.drawArc(280, 110, 80, 60, 0, 180);

          int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50};

          int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190};

          Polygon poly=new Polygon(arrayX, arrayY, 8);

          g.drawPolygon(poly);

          Point aPoint = new Point(50, 190);

         if(poly.contains(aPoint))

          {

                   g.drawString("Yes", 50, 190);

          }

          newColor = new Color(0, 0, 255);

          g.setColor(newColor);

          Font font =new Font("Tahoma",Font. BOLD|Font.ITALIC, 40);

          Font oldFont = g.getFont();

          g.setFont(font);

          g.drawString("SBP", 270, 220);

          g.setFont(oldFont);

          g.setColor(oldColor);

          g.drawLine(20, 220, 20, 350);

          g.drawLine(20, 350, 360, 350);

          g.drawString("Y", 25, 230);

          g.drawString("X", 350, 346);  

          int[] xArray = {20, 40, 60, 80, 100, 120, 130, 140, 280, 332};

Информация о работе Реализация игры pong на языке Java с помощью технологии Socket