safronovba_lan_2

advertisement
Федеральное агентство по образованию
Государственное образовательное учреждение высшего
профессионального образования
«ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт – Институт Кибернетики.
Направление (специальность) – Информатики и Вычислительная техника
Кафедра - Оптимизации Систем Управления.
ЛАБОРАТОРНАЯ РАБОТА: ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
ПРОТОКОЛА ВЫСОКОГО УРОВНЯ.
Отчет по лабораторной работе № 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. Была произведена обработка исключений.
Download