Обновить
20
0
Sergio Ivanuzzo @ivanuzzo

React/Rust Developer

Отправить сообщение

а можно все это обернуть в метавселенную ?

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

это интересное замечание, очень хочется проверить, только не уверен, что правильно вас до конца понимаю. Вот метод, который использует Reader и как он используется в Client :

// stream.rs
pub async fn read(&mut self) -> Result<Vec<Vec<u8>>, Error> {
	let mut buffer = [0u8; 65536];

	match self.stream.read(&mut buffer).await {
		Ok(bytes_count) => {
			// ...
		},
		Err(err) => {
			// ...
		},
	}
}

// client.rs
fn handle_read(&mut self) -> JoinHandle<()> {
	let input_queue = Arc::clone(&self._input_queue);
	let reader = Arc::clone(&self._reader);

	tokio::spawn(async move {
		loop {
			match &mut *reader.lock().await {
				Some(reader) => {
					if let Some(packets) = reader.read().await.ok() {
						input_queue.lock().unwrap().push_back(packets);
					}
				},
				None => {},
			};

			sleep(Duration::from_millis(READ_TIMEOUT)).await;
		}
	})
}

правильно ли я понимаю, что bytes_count может быть длиной фрагмента, а не целого пакета ? (на практике такого еще не было, но мало ли)

далее, ваш второй пример, строка, на которой вы получаете `size` по всей видимости используется вне этого Reader (т.к. self.reader я использую только в Client ):

let size = self.reader.read_u16().await? as usize;

но в таком случае, у меня не предусмотрен вызов read_u16 из Reader. Кажется, в вашем примере чего-то не хватает. Можете, пожалуйста, уточнить, где подразумевается использовать код начиная с пункта 2 ? Если внутри метода read , то зачем нам получать size, если он уже возвращается в bytes_count; если извне - то как в таком случае должен выглядеть Reader ? просто обернуть stream в BufReader явно недостаточно

можете уточнить, что вы подразумеваете под "нормальным ожиданием" ?

насчет сна - разве он не для того, чтобы снять нагрузку на CPU ? насколько я знаю, loop создает такую нагрузку.

нормальный read в моем случае не работает. Вкратце, ситуация следующая: в процессе входа в мир клиент сначала логинится к LoginServer, после выбора рилма из списка - происходит коннект на WorldServer. Т.е. когда я делаю этот второй коннект, я подменяю текущий TCPStream на новый. И вот если при коннекте на мой локальный сервер (mangos) все ок, то при коннекте на любой удаленный - клиент просто висит, долго, а потом в конце-концов коннектится таки, но не может прочитать пакеты и падает (нормальный read прочел пакет с 0 длины почему-то). На мой взгляд, причина тут в том, что чтение происходит непрерывно, и когда я объявляю сон (либо просто использую try_read), то на клиентской стороне образуется зазор для соединения. В случае с нормальным read такого зазора нету, поэтому либо делать сон с минимально малым временем на соединение, либо - использовать try_read.

рад, что статья вам понравилась !

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

скажем так: в моем случае наступал какой-то предел, после которого я не мог себя заставить писать код на языке, на котором еще недавно делал всякие нехорошие вещи. Со временем это проходит, но запала уже нету. Поэтому хочется, чтобы были инструменты, которые вызывают по большей части положительные эмоции. Короче, инженеру надо где-то отдыхать :) (если мы рассматриваем отдых, как смену деятельности)

Мне нравится мой код (да, я понимаю, что это - временно), но когда я пойму, что в нем что-то не так - я его перепишу, если надо - с нуля. Но не буду продолжать писать то, что не нравится.

А коммерческий код очень часто приходится писать, даже если не нравится, потому что не всегда есть время на рефакторинг.

P.S. пора писать статью "Rust как форма эскапизма"

начинал с JavaScript (до сих пор является основным стэком в форме React.js), так же несколько лет был PHP (в основном в виде Symfony2) и Python. На этих языках писал и коммерческий код, и код для своих личных проектов. На Rust боюсь писать коммерческий. Боюсь, что заставят писать какую-то гадость и разочаруюсь, как это уже было с Python.

Так же добавлю (тоже не в целях разжигания), что хотя и не использую плюсы, но регулярно приходится разбираться в коде на C++ (конкретно, проект mangos и его производные). И я бы не назвал код на плюсах самым читабельным. Хотя, может, это конкретно там он такой.

Говоря откровенно, нравится практически все. Есть просто нюансы, которые надо знать (ну или придется узнать). Как например, `as u32` и `u32::from` - ведут себя по-разному (as - в случае чего просто молча обрежет, а from - выдаст ошибку, поэтому рекомендуется использовать именно from).

Читать учебник по Rust - это боль еще та. Нужно быть очень замотивированным, чтобы его изучить. Но когда разберешься - на Rust писать очень просто становится, я бы сказал, что для меня Rust - лучший язык программирования из всех, с которыми я сталкивался. Короче, рекомендую однозначно.

Собственно, перед тем, как приступать к проекту я где-то месяц сидел над этим учебником. И, думаю, правильно сделал, поскольку часто бывает, когда пришедшие в Rust с другого языка пишут код так, будто они его пишут на привычном языке.

Комьюнити у Rust - так же лучшее из тех, с которыми приходилось общаться. Очень подробно и грамотно отвечают на вопросы у них на форуме.

Хоть какая-то душа, по мнению создателей теории в 4chan, осталась только у аниме

На этом моменте показалось, что статья создавалась ради этой строчки. Хорошо завуалированная реклама аниме. Сначала нагнетается атмосфера безысходности, а потом приоткрывается путь к спасению. В виде аниме.

Картинка не моя, но более простой схемы я еще не встречал.
image
с плагиатом
я и не утверждал, что это нацистский символ. Тем не менее, Вермахт — вооруженные силы Третьего Рейха. И вы наверняка в курсе, что были еще малые Нюрнбергские процессы, где судили также отдельных командующих Вермахта. В том числе за то, что Вермахт прямо или косвенно сотрудничал с СС. А по поводу «похожести» — не готов судить. Потому что можно далеко зайти.
Пусть я не первый, кто заметил это сходство, но, похоже, я задал новый тренд в плане стилистики оформления (раз, и два — более ранний).
Тогда на ютубе тоже нужно бороться
image
Забыл одну важную деталь добавить — что собственно было реализовано. Обновил статью.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Специалист
Senior