Міністерство науки та освіти, молоді та спорту України
Сумський Державний Університет
Кафедра комп’ютерних наук
Обов’язкове домашнє завдання
з «Комп’ютерних мереж»
Варіант №13
Виконав Чалий О.В.
Студент ІН-91
Перевірив Ободяк В.К.
Суми, 2011
Постановка задачі
Написати додаток, який складається з двох частин: сервер та клієнт. Сервер приймає від клієнта строку з декількома словами і повертає назад кількість слів у цій строчці. Клієнт та сервер обмінюються інформацією через сокети. Реалізувати графічний або консольний інтерфейс.
Описання виконання роботи
Програма була розроблена мовою Java. Мова Java вибрана через простоту реалізації обміну даних між клієнтом та сервером, у простому обчисленні вхідних даних та кросплатформність.
У програмі є два класси: Server.java та Client.java, які відповідають за серверну та клієнтську частину програми.
Клієнт:
1) Підключається до серверу за допомогою сокета. Створює 3 потоки даних : вхідний в сокет, вихідний з сокету та вхідний з консолі. Для цього використовуються методи getInputStream(), getOutputStream() класу java.net.Socket та потоки даних пакету java.io.
2) Отримує дані від користувача з консолі.
3) Відправляє ці дані серверу і чекає відповіді.
4) Після отримання відповіді, знову готовий отримувати дані від користувача.
Сервер:
1) Створює серверний сокет (java.net.ServerSocket)
2) Очікує підключення клієнта.
3) Якщо клієнт підключився, то створює клієнтський сокет
4) Створює потоку вводу та виводу в сокет.
5) Отримує дані з сокета.
6) За допомогою класу StringTokenizer рахує кількість лексем(токенів, слів).
7) Кількість слів відправляє клієнту.
8) Чекає нових даних.
Під час запуску програми необхідно у якості параметрів передати:
1) для клієнта – хост та порт серверного сокета
2) для сервера – порт сокета.
Сервер і клієнт працюють на одному порту, який повинен бути більшим за 1024 (для того, щоб програма коректно працювала у UNIX – подібних системах).
Під час роботи сервера або клієнта можливі ситуації, коли програма може повести себе не коректно, з помилками. Через це, можливі помилки обробляються і виводяться відповідні повідомлення на екран. Це робиться за допомогою блоків try, catch, finally.
Для того, щоб підрахувати кількість слів у строчці, використовується стандартний клас java.util.StringTokenizer, який розбиває строку на токени (лексеми). По - замовчуванню, лексеми розділяються одним або декількома пропусками (пробілами). В якості параметра, в конструктор класу StringTokenizer передається строчка, яку необхідно розбити на лексеми. За допомогою метода countTokens() підраховується кількість лексем.
Для обробки строк використовувались наступні методи:
Trim() – видаляє зайві пробіли на початку та в кінці строки
toLowerCase() – переводить строчку у нижній регістр.
Equals(String) – перевіряє строку на рівність.
Для роботи з сокетом та потоками даних використовувались наступні методи:
Println(String) – записує строку у потік, з переходом на нову строку
flush() – очищає потік
accept() – очікує підключення і у разі успішного підключення клієнта створює сокет.
Close() – закриває потік або сокет.
readLine () – зчитує строку з потоку. Повертає строку (String)
Код програми
Server.java
package ua.sumdu.chalyi.seti.odz;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.StringTokenizer;
public class Server{
public static void main(String args[]){
BufferedReader in = null; //вхідний потік з сокету
BufferedReader stdIn = null; //вхідний потік з консолі
PrintWriter out = null; //вихідний потік у сокет
ServerSocket ss = null; //Серверний сокет
Socket sc = null; //Клієнтський сокет
try {
ss = new ServerSocket(Integer.parseInt(args[0])); //створює серверний сокет
System.out.println("Сервер создан!");
sc = ss.accept(); //очікує підключення клієнта
System.out.println("Клиент присоединился!");
out = new PrintWriter(sc.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(sc.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
while (true){
String fromClient = in.readLine(); //зчитує строку з сокета
if (fromClient == null){
break;
}
System.out.println("Полученая строка от клиента : " + fromClient);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.