1900 год. "Барселона" выбрала свое первое поле, которое находилось рядом с гостиницей "Казанова". Первый матч каталонские футболисты сыграли против команды Римской Испании - 0:0.
Кто-нибудь знаком с такими языками программирования как: 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.