<MyRusakov.ru />

Создание крупного проекта на Java с нуля

Создание крупного проекта на Java с нуля

Данный курс научит Вас создавать крупные проекты на Java грамотно и быстро. В курсе Вы увидите создание большой и сложной программы на Java абсолютно с нуля.

В начале курса у нас будет только идея, а в конце готовый продукт, который можно использовать в практических целях.

В рамках упражнений курса Вы параллельно со мной будете создавать свою большую программу на Java, что даст Вам необходимую практику, после которой для Вас уже не будет разницы, какого размера создавать программы.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Форум сайта MyRusakov.ru

Socket.client\server
25.12.2011 07:03:52 Socket.client\server Сообщение #1
int

int

Освоившийся

Освоившийся

Дата регистрации:
26.10.2011 05:32:04

Сообщений: 32

Здравствуйте, Михаил. На днях задался целью написать клиент\сервер средствами php socket, но столкнулся с банальной проблемой непонимания принципа.
Как отправлять заголовки и информацию посредством сокетов - это более чем понятно.
Не понятен сам алгоритм взаимодействия клиента и сервера. Вот нашел в сети один из немногих подобных примеров. Это код сервера из которого многое не понятно. (Клиента копировать не стал что бы не загружать страницу)

header('Content-Type: text/plain;');
error_reporting(E_ALL ^ E_WARNING);
set_time_limit(0);
ob_implicit_flush();

echo "-= Server =-\n\n";

$address = 'site.ru';
$port = 10001;

try {

echo 'Create socket ... ';
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n";
} else {
echo "OK\n";
}

echo 'Bind socket ... ';
if (($ret = socket_bind($sock, $address, $port)) < 0) {
throw new Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n";
} else {
echo "OK\n";
}

echo 'Listen socket ... ';
if (($ret = socket_listen($sock, 5)) < 0) {
throw new Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n";
} else {
echo "OK\n";
}

do {
echo 'Accept socket ... ';
if (($msgsock = socket_accept($sock)) < 0) {
throw new Exception('socket_accept() failed: '.socket_strerror(socket_last_error())."\n";
} else {
echo "OK\n";
}

$msg = "Hello, Client!";
echo "Say to client ($msg) ... ";
socket_write($msgsock, $msg, strlen($msg));
echo "OK\n";

do {

echo 'Client said: ';
if (false === ($buf = socket_read($msgsock, 1024))) {
throw new Exception('socket_read() failed: '.socket_strerror(socket_last_error())."\n";
} else {
echo $buf."\n";
}

if (!$buf = trim($buf)) {
continue;
}

if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}

echo "Say to client ($buf) ... ";
socket_write($msgsock, $buf, strlen($buf));
echo "OK\n";

} while (true);

} while (true);

} catch (Exception $e) {
echo "\nError: ".$e->getMessage();
}

if (isset($sock)) {

echo 'Close socket ... ';
socket_close($sock);
echo "OK\n";

}



Не могли бы Вы просто описать алгорим работы, не кодом, а обычным языком? "AF_INET, SOCK_STREAM, SOL_TCP" - Эти параметры мне понятны. Нашел по ним информацию в факах языка C++.
Профиль Ответить
25.12.2011 12:27:11 Socket.client\server Сообщение #2
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Я пробегусь по основным моментам:
1) Делается динамический вывод (ob_implicit_flush(). Это означает, что не нужно использовать flush() для мгновенного вывода в выходной поток.
2) Создаётся сокет.
3) Связывается созданный сокет с соответствующим адресом (socket_bind()).
4) Начинается прослушивание сокета, фактически, это ожидание данный от клиента. Причём максимальное количество допустимых соединение 5.
5) Затем начинается бесконечный цикл, в котором сервер ждёт приёма данных от клиента. При получении данных он их считывает и отдаёт клиенту ответ.
6) В самом конце сокет закрывается.
7) Так же здесь полно исключений, которые выбрасываются при самых различных ошибках.
Профиль Ответить
25.12.2011 16:31:26 Socket.client\server Сообщение #3
int

int

Освоившийся

Освоившийся

Дата регистрации:
26.10.2011 05:32:04

Сообщений: 32

Михаил, спасибо Вам. Как оказалось все предельно просто) Просто видимо мне не совсем удачный пример попался) Видимо автор только для себя его писал
Профиль Ответить
01.01.2012 20:54:17 Socket.client\server Сообщение #4
int

int

Освоившийся

Освоившийся

Дата регистрации:
26.10.2011 05:32:04

Сообщений: 32

Еще раз здравствуйте и с новым годом)
С блокирующими сокетами разобрался, теперь пробую построить приложение клиенты\сервер на неблок сокетах.
Скажите, Михаил .. не абсурдно ли на php заниматься настолько низкоуровневым сетевым программированием? Просто смотрю справочник функций sock PHP и везде есть приписка "тестовая функция" и тому подобное. Что бы Вы предпочли, допустим, для создания чата на локалхосте? perl,c++ или все таки PHP им ни чем уступает в общем? Про однопоточность php знаю.

П.с Вообще тема сетевого программирования меня очень заинтересовала. Начал с PHP потому что на этом языке проще понять принципы и потом уже переходить на другие, более мощные деск языки, в частности на тот же с++ . Везде winsock ведь подобен.
Надеюсь вопросы задал понятно
Профиль Ответить
01.01.2012 22:47:47 Socket.client\server Сообщение #5
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Не очень понимаю, зачем для чата нужен PHP. Сколько раз его делал, всегда хватало стандартных и проверенных функций, а также iframe, либо JQuery+Ajax.
Профиль Ответить