Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования «ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Институт – Институт Кибернетики. Направление (специальность) – Информатики и Вычислительная техника Кафедра - Оптимизации Систем Управления. ЛАБОРАТОРНАЯ РАБОТА: ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ПРОТОКОЛА ВЫСОКОГО УРОВНЯ. Отчет по лабораторной работе № 2. По дисциплине Сети ЭВМ и ТК. Выполнил Студент группы 8В83 ________________ Б.А. Сафронов Подпись ________________ дата Руководитель Старший преподаватель ________________ Подпись ________________ дата Томск 2011. В.А. Дорофеев Задание: Разработать приложение, выполняющее роль клиента или сервера для одного из протоколов высокого уровня: HTTP SMTP POP3 FTP Другой (по согласованию с преподавателем) При выполнении этого задания можно работать в паре: один человек может взять на себя написание серверной части, другой – клиентской. При одиночной работе допустимо использовать сторонние серверы или клиенты, не требующие установки или находящиеся в сети. Недопустимо использование высокоуровневых протоколов или классов, реализующих указанную функциональность: в качестве инструмента должны использоваться только классы и процедуры для работы с сокетами, которые встроены в основную библиотеку классов выбранного языка. В окне программ должна быть предусмотрена возможность просмотра логов: полных текстов запросов и ответов на них. В отчете приведите исходные тексты обоих программ, а также снимки окон программ в процессе работы. Результаты работы: import java.io.*; import java.net.*; import java.text.DateFormat; import java.util.Date; import java.util.TimeZone; class WEBServer extends Thread { Socket socket; public static void main(String args[]) { try { ServerSocket server = new ServerSocket(86, 0, InetAddress.getByName("localhost")); System.out.println("server is started"); while (true) { new WEBServer(server.accept()); System.out.println("client connected"); } } catch (Exception e) { e.printStackTrace(); } } public WEBServer(Socket socket) { this.socket = socket; setDaemon(true); setPriority(NORM_PRIORITY); start(); } public void run() { try { InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); byte buf[] = new byte[64 * 1024]; int r = inputStream.read(buf); String request = new String(buf, 0, r); String path = getPath(request); if (path == null) { String response; DateFormat df = DateFormat.getTimeInstance(); df.setTimeZone(TimeZone.getTimeZone("GMT")); response = "HTTP/1.1 400 Bad Request Connection: close Server: WEBServer Pragma: no-cache " + "Date: " + df.format(new Date()) + "\n"; System.out.println(response); outputStream.write(response.getBytes()); socket.close(); return; } File file = new File(path); boolean flag = !file.exists(); if ((!flag) & (file.isDirectory())) { if (path.lastIndexOf("" + File.separator) == path.length() - 1) path = path + "index.htm"; else path = path + File.separator + "index.htm"; file = new File(path); flag = !file.exists(); } if (flag) { String response = "HTTP/1.1 404 Not Found\n"; DateFormat df = DateFormat.getTimeInstance(); df.setTimeZone(TimeZone.getTimeZone("GMT")); response = response + "Date: " + df.format(new Date()) + "\n"; response = response + "Content-Type: text/plain\n" + "Connection: close\n" + "Server: WEBServer\n" + "Pragma: no-cache\n\n"; response = response + "HTTP/1.1 404 Not Found\n" + "File " + path + " not found!"; outputStream.write(response.getBytes()); socket.close(); return; } String mime = "text/plain"; r = path.lastIndexOf("."); if (r > 0) { String ext = path.substring(r); if (ext.equalsIgnoreCase(".html")) mime = "text/html"; else if (ext.equalsIgnoreCase(".htm")) mime = "text/html"; else if (ext.equalsIgnoreCase("gif")) mime = "image/gif"; else if (ext.equalsIgnoreCase("jpg")) mime = "image/jpeg"; else if (ext.equalsIgnoreCase("jpeg")) mime = "image/jpeg"; else if (ext.equalsIgnoreCase("bmp")) mime = "image/x-xbitmap"; } // создаём ответ String response = "HTTP/1.1 200 OK\n"; System.out.println(response); DateFormat df = DateFormat.getTimeInstance(); df.setTimeZone(TimeZone.getTimeZone("GMT")); response = response + "Last-Modified: " + df.format(new Date(file.lastModified())) + "\n"; response = response + "Content-Length: " + file.length() + "\n"; response = response + "Content-Type: " + mime + "\n"; response = response + "Connection: close\n" + "Server: WEBServer\n\n"; outputStream.write(response.getBytes()); FileInputStream fileInputStream = new FileInputStream(path); r = 1; while (r > 0) { r = fileInputStream.read(buf); if (r > 0) outputStream.write(buf, 0, r); } fileInputStream.close(); // завершаем соединение socket.close(); } catch (Exception e) { e.printStackTrace(); } } protected String getPath(String header) { String URI = extract(header, "GET ", " "), path; if (URI == null) URI = extract(header, "POST ", " "); if (URI == null) return null; path = URI.toLowerCase(); if (path.indexOf("http://", 0) == 0) { URI = URI.substring(7); URI = URI.substring(URI.indexOf("/", 0)); } else if (path.indexOf("/", 0) == 0) URI = URI.substring(1); int i = URI.indexOf("?"); if (i > 0) URI = URI.substring(0, i); i = URI.indexOf("#"); if (i > 0) URI = URI.substring(0, i); path = "." + File.separator; char a; for (i = 0; i < URI.length(); i++) { a = URI.charAt(i); if (a == '/') path = path + File.separator; else path = path + a; } return path; } protected String extract(String str, String start, String end) { int s = str.indexOf("\n\n", 0), e; if (s < 0) s = str.indexOf("\r\n\r\n", 0); if (s > 0) str = str.substring(0, s); s = str.indexOf(start, 0) + start.length(); if (s < start.length()) return null; e = str.indexOf(end, s); if (e < 0) e = str.length(); return (str.substring(s, e)).trim(); } } Вывод: В результате проделанной работы мной была реализована работа протокола HTTP. Была произведена обработка исключений.