Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Приведем пример такого решения: import Java.io.*; importjava.net.*;
public class NetServer {
public static final int PORT = 2500; private static final int TIMERS EN DSLEEP = 100; private static final int COUNT_TO_SEND = 10; private ServerSocket servSocket;
public static void main(String[] args) { NetServer server = new NetServer(); server. go();
}
public NetServer() { try{
servSocket = new ServerSocket(PORT); } catch(IOException e) {
System.err.println("Unable to open Server Socket:" + e.toString());
}
public void go() {
// Класс-поток для работы с подключившимся клиентом class Listener implements Runnable { Socket socket;
public Listener(Socket aSocket) { socket = aSocket;
}
public void run() { try{
System.out.println("Listener started"); int count = 0;
OutputStream out = socket.getOutputStream(); OutputStreamWriter writer = new
OutputStreamWriter(out); PrintWriter pWriter = new PrintWriter(writer); while (count<COUNT_TO_SEND) {
count++;
pWriter.print(((count>1)?",":"")+ "Say" + count);
Sleeps(TIME_SEND_SLEEP);
}
pWriter.close(); } catch(IOException e) {
System.err.println("Exception : " + e.toString());
}
}
}
//Основной поток, циклически выполняющий метод accept() System, out. printlnfServer started"); while (true) { try{
Socket socket = servSocket.accept(); Listener listener = new Listener(socket); Thread thread = new Thread(listener); thread.start(); } catch(IOException e) {
System.err.println("IOException :" + e.toString());
}
}
}
public void sleeps(long time) { try{
Thread.sleep(time); } catch(lnterruptedException e) { }
}
}
Теперь объявим клиента. Эта программа будет запускать несколько потоков, каждый из которых независимо подключается к серверу, считывает его ответ и выводит на консоль.
import java.io.*; importjava.net.*;
public class NetClient implements Runnable { public static final int PORT = 2500; public static final String HOST = "localhost"; public static final int CLIENTS_COUNT = 5;
Программирование на Java
Лекция 16
Введение В Сетевые nnn-m^ni ,
public static final int READ_BUFFER_S1ZE = 10; private String name = null;
public static void main(String[] args) { String name = "name"; for (int i=1; i<=CUENTS_COUNT; i++) {
NetClient client = new NetClient(name+i);
Thread thread - newThread(client);
thread.start();
}
}
public NetClient(String name) { this.name = name;
}
public void run() {
char[] readed = newchar[READ_BUFFER_SIZE]; StringBuffer strBuff = new StringBuffer(); try{
Socket socket = new Socket(HOST, PORT); InputStream in = socket.getlnputStream(); InputStreamReader reader = new InputStreamReader(in);
while (true) {
int count = reader, read (readed, 0,
READ_BUFFER_SlZE); if (count—-1) break; strBuff.append(readed, 0, count); Thread .yield();
}
} catch (UnknownHostException e) {
e. prints tackTrace(); } catch (lOException e) {
e.printStackTrace();
}
System.out.printlnfclient" + name + " read :" + strBuff.toStringO);
}
Теперь рассмотрим UDP. Для работы с этим протоколом и на стороне клиента, и на стороне сервера используется класс DatagramSocket У него есть следующие конструкторы:
DatagramSocketO DatagramSocket(int port) DatagramSocket(int port, InetAddress laddr)
При вызове первого конструктора сокет открывается на произвольном доступном порту, что уместно для клиента. Конструктор с одним параметром, задающим порт, как правило, применяется на серверах, чтобы клиенты знали, на каком порту им нужно пытаться устанавливать соединение. Наконец, последний конструктор необходим для машин, у которых присутствует несколько сетевых интерфейсов.
После открытия сокетов начинается обмен датаграммами. Они представляются экземплярами класса DatagramPacket. При отсылке сообщения применяется следующий конструктор:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
Массив содержит данные для отправки (созданный пакет будет иметь длину, равную length), а адрес и порт указывают получателя пакета. После этого вызывается метод send() класса DatagramSocket.
try {
DatagramSocket s = new DatagramSocketO; byte data[]={1, 2, 3};
InetAddress addr = lnetAddress.getByName("localhost"); DatagramPacket p = new DatagramPacket(data, 3, addr, 3456); s.send(p);
System.out.println("Datagram sent");
s.close(); } catch (SocketException e) {
e.printStackTrace(); } catch (UnknownHostException e) {
e.printStackTrace(); } catch (lOException e) {
e.printStackTrace();
}
Для получения датаграммы также создается экземпляр класса DatagramPacket, но в конструктор передается лишь массив, в который
3440
577
будут записаны полученные данные (также указывается ожидаемая длина пакета). Сокет необходимо создать с указанием порта, иначе, скорее всего, сообщение просто не дойдет до адресата. Используется метод receive() класса DatagramSocket (аналогично методу ServerSocket.accept(), этот метод также прерывает выполнение потока, пока не придет запрос от клиента). Пример реализации получателя:
try {
DatagramSocket s = new DatagramSocket(3456); byte data[]=new byte[3];
DatagramPacket p = new DatagramPacket(data, 3);
System.out.println("Waiting...");
s.receive(p);
System.out.println("Datagram received: "+data[0]+", "+data[1]+", "+data[2]);
s.close(); } catch (SocketException e) {
e.printStackTrace(); } catch (lOException e) {
e. pri ntStackTrace();
}
Если запустить сначала получателя, а затем отправителя, то можно увидеть, что первый напечатает содержимое полученной датаграммы, а потом программы завершат свою работу.
В заключение приведем пример сервера, который получает датаграммы и отправляет их обратно, дописав к ним слово received.
import java. io.*; import java.net.*;
public class DatagramDemoServer { public static final int PORT = 2000; private static final int LENGTH_RECEIVE = 1; private static final byte[] answer = ("received").getBytes(); private DatagramSocket servSocket = null; private boolean keepRunning = true; public static void main(String[] args) {
DatagramDemoServer server = new DatagramDemoServer();
server.service();
public DatagramDemoServerO { try {
servSocket = new DatagramSocket(PORT); } catch(SocketException e) {
System.err.println("Unable to open socket : " + e.toStringQ);
}
}
protected void service() { DatagramPacket datagram; InetAddress clientAddr; int clientPort; byte[] data; while (keepRunning) { try {
data = new byte[LENGTH_RECEIVE];
datagram = new DatagramPacket(data, data.length);
servSocket. receive(datagram);
clientAddr = datagram. getAddress();
clientPort = datagram.getPort();
data = getSendData(datagram.getData());
datagram = new DatagramPacket(data, data.length,
clientAddr, clientPort); servSocket.send(datagram); } catch(IOException e) {
System.err.println("l/0 Exception : " + e.toStringO);
}
}
}
protected byte[] getSendData(byte b[]) {
byte[] result = new bytefb.length+answer.length]; System.arraycopy(b, 0, result, 0, b.length); System.arraycopy(answer, 0, result, b.length, answer.length); return result;
}
}
Заключение
В данном разделе были рассмотрены теоретические основы сети как одной большой взаимодействующей системы. Были описаны все уровни модели OSI и их функциональные назначения. Также были представлены основные утилиты, используемые для настройки и обнаружения неис-
правностей в сети. Затем были рассмотрены средства Java для работы с наиболее распространенными сетевыми проколами. Приведен подробный пример и для более сложного случая — сервер, обслуживающий несколько клиентов одновременно.
Вариант 1
1. Назовите сете-зависимые уровни модели OSI.
П уровень передачи данных Г*| представительский уровень Г*| сессионный уровень П физический уровень
□ транспортный уровень Г*| сетевой уровень
П уровень приложений
2. Какие из следующих адресов относятся к подсети класса В?
□ 194.80.20.1
□ 172.16.0.1
□ 172.16.256.2
□ 140.150.160.1
□ 224.0.0.10
3. Каким классом лучше воспользоваться для загрузки web-страницы с сервера?
□ URL
□ Socket
□ DatagramSocket
Вариант 2
Вариант 3
1. Назовите сете-независимые уровни модели OSI.
П уровень передачи данных
П представительский уровень
П сессионный уровень
П физический уровень
П транспортный уровень
Г~| сетевой уровень
П уровень приложений
1. Какие из перечисленных ниже терминов относятся к подуровням второго уровня?
□ |
LLC |
□ |
МАС |
□ |
TCP |
□ |
ARP |
□ |
RIP |
2. Какие из перечисленных ниже характеристик относятся к протоколу TCP?
образование постоянного соединения |~| не гарантирует доставку сообщения |~| использование в важных сервисах П протокол уровня приложений
3. Каким классом лучше воспользоваться для рассылки сигналов точного времени?
□ URL
□ Socket
□ DatagramSocket
2. Какие из утилит используются для тестирования работоспособности сети в ОС Windows?
□ |
ping |
□ |
telnet |
□ |
routed |
□ |
ifconfig |
□ |
netstat |
□ |
traceroute |
3. Можно ли с помощью класса URL пересылать данные на сервер?
□ нет
□ да
□ да,если сервер позволяет закачивание (upload) данных.
Программирование на Java