1925 год. Во время домашнего матча команды зрители освистали национальный гимн Испании, протестуя против режима диктатуры, за что правительство закрыло стадион "Лес Кортс" на шесть месяцев. Позже срок дисквалификации был сокращен вдвое.
Кто-нибудь знаком с такими языками программирования как: LD, FBD, SFC, ST, IL, CFC ?
Просто все они являются языками программирования ПЛК, и первые три из них - графические.
Хотелось бы узнать, насколько сильно отличаются принципы программирования графических языков ПЛК от т.н. "неграфических", в частнотсти, и различие этих шести языков для ПЛК от всеми известных языков программирования (Объектно-ориентированных, скриптовых и т.д.) таких как: Delphi, C++, Assembler и т.д.
Вопрос скорее к знающим Java, но и от любой помощи не откажусь.
Столкнулся с задачей написать клиент-сервер на любом языке, решающий простое задание.
Т.к. сам сейчас начал изучать java, решил на нем и писать.
Задание - сортировка шести чисел по частям.
Имеется строка с шестью числами через пробел на сервере с ограничением на 3 клиентов.
Клиент разбивает этот "массив" (никакой это не массив, просто слово другого не смог подобрать) на 3 куска и отправляет клиентам, чтобы они каждый свой кусок отсортировали и вернули серверу, чтобы что-то еще кое-что дальше сделать, но до этого еще дойти надо....
Так вот, по не знанию матчасти столкнулся с вопросами:
1. у меня при описании сервера есть переменная i, с помощью которой я и подсчитываю клиенты и обрубаю подключения новых, когда i>3. Хотя в мануале написано про какой-то backlog. .
.
.
public ServerSocket(int port,
int backlog)
throws IOException
Creates a server socket and binds it to the specified local port number, with the specified backlog. A port number of 0 creates a socket on any free port.
.
.
.
Как я понял, он и должен этим заниматься, и я поставил тройку после номера порта, но это ничего не дало. Скорее всего это я что-то делаю не так.
2. Не пойму как оперировать этими клиентами. Т.е. как сделать так, чтобы он первые 2 числа отправлял 1-му клиенту, вторые - 2-му, третьи - 3-му и чтобы я мог вывести на экран номер подключенного клиента. Знаю только как отправить что-то определенное и известное, но не в зависимости от номера клиента.
Server:
PHP код:
import java.io.*; import java.net.*;
class Server extends Thread { Socket s;
public static void main(String args[]) { try { int i = 0; // счётчик подключений
// привинтить сокет на локалхост, порт 6665 ServerSocket server = new ServerSocket(6665, 3);
System.out.println("server is started");
// слушаем порт while(i<4) { // ждём нового подключения, после чего запускаем обработку клиента // в новый вычислительный поток и увеличиваем счётчик на единичку new Server(server.accept()); i++; } } catch(Exception e) {System.out.println("init error: "+e); } // вывод исключений
}
public Server(Socket s) { // копируем данные this.s = s;
// и запускаем новый вычислительный поток (см. ф-ю run()) setDaemon(true); setPriority(NORM_PRIORITY); start(); }
public void run() { try { InputStream sin = s.getInputStream(); OutputStream sout = s.getOutputStream();
DataInputStream in = new DataInputStream(sin); DataOutputStream out = new DataOutputStream(sout);
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
Непонятно зачем при осваивании основ работать с многопоточностью. Однопоточный сервер, принимаем подключения одно за другим в цикле. Определение порядкового номера подключения проблем вызывать не должно.
Backlog определяет длину очереди. Если сервер обрабатывает клиента быстрее, чем интервалы между клиентами (а это насколько я понял твой случай) в этом параметре нет смысла.
Пример. Допустим backlog равен 5. На обработку клиента нужна минута. В первую секунду каждой минуты стучатся 3 клиента.
1 минута - все 3 клиента зашли в очередь и первый поступил на обработку.
2 минута - первый клиент отключился, в очереди остались двое, как раз хватает места для 3 новых клиентов.
3 минута - второй клиент отключился, в очереди осталось 4. Место осталось только для одного нового (backlog == 5), поэтому два остальных получат connection refused.
__________________
Не ошибается тот - кто не думает.(C)RIVALDO
Короче поковырялся сегодня - вроде как удалось передать каждому клиенту то, что нужно, но местами набыдлокодил - if в while - масло масленное. Ладно, разбираться потом буду. Все же сдавать уже в следующую пятницу, а еще сортировку по частям на всем этом реализовывать, да и препод по сетевым технологиям в языках ничего не смыслит. Главное, что работает на данном этапе. Плотнее языком летом займусь.
Сервер:
PHP код:
import java.io.*; import java.net.*;
class Server extends Thread { Socket socket;
//num - номер клиента, a - номер массивов для метода run() int num=1, a=0;
//исходные числа, которые сортируем String line = "6 5 4 3 2 1";
try { //i - счетчик подключений, a - номер массивов для метода run() int i = 1,a = 0;
// создаем сервер на локалхост, порт 6665 ServerSocket server = new ServerSocket(6665);
System.out.println("server is started"); System.out.println("\n---------------------------------------");
// слушаем порт while(i<=4) { // WARNING! // Следующие 15 строчек - быдлокод!(не исключено,что есть еще) if (i>3){ server.close(); } else{ // ждём нового подключения, после чего запускаем обработку клиента // в новый вычислительный поток и увеличиваем счётчик на единичку /*!*/ new Server(i, server.accept(), a); //сам не понял, почему надо писать так, но работает
//Инфа о подключенных клиентах System.out.println("\nClient " + i + " connected!");
i++; //увеличиваем счётчик a=a+2; //берем следующие 2 числа } } } catch(Exception e) {System.out.println("init error: "+e); // вывод исключений }
}
public Server(int num, Socket socket, int a) { // копируем данные this.socket = socket; this.a = a; this.num = num;
// и запускаем новый вычислительный поток (см. ф-ю run()) setDaemon(true); setPriority(NORM_PRIORITY); start(); }
public void run() {
try { // из сокета клиента берём поток входящих данных InputStream sin = socket.getInputStream(); // и оттуда же - поток данных от сервера к клиенту OutputStream sout = socket.getOutputStream();
// Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения DataInputStream in = new DataInputStream(sin); DataOutputStream out = new DataOutputStream(sout);
System.out.println("\nSending to " + num + " client!");
// отсылаем клиенту строку = число1_число2 out.writeUTF(String.valueOf(Integer.valueOf(str[a])+" "+ Integer.valueOf(str[a+1]))); // выводим ее на экран System.out.println(String.valueOf(Integer.valueOf(str[a])+" "+ Integer.valueOf(str[a+1])));
// ожидаем пока клиент пришлет строку текста in.readUTF();
// отчет о клиенте System.out.println("Client " + num + " got a pocket!"); System.out.println("\n---------------------------------------");
public static void main(String[] args) throws Exception { try {
// создаем сокет на локалхост, порт 6665 Socket socket = new Socket("localhost", 6665);
// из сокета клиента берём поток входящих данных InputStream sin = socket.getInputStream();
// и оттуда же - поток данных от сервера к клиенту OutputStream sout = socket.getOutputStream();
// Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения DataInputStream in = new DataInputStream(sin); DataOutputStream out = new DataOutputStream(sout);
String line,c = null;
// ожидаем пока клиент пришлет строку текста line = in.readUTF();
Только по идее он должен выключаться при попытке подключить четвертый клиент, но он продолжает работать, а на клиент выдается вот это: run:
init error: java.net.ConnectException: Connection refused: connect
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 2 секунды)
Последний раз редактировалось К@t@LoNeЦ, 22.05.2014 в 20:23.