koala написав:Зараз ви мені репутацію трохи виправите...
Не хочу детально лізти в код, але:
0. Для синхронізації в реальному часі, як не дивно, UDP кращий.
1. Немає перевірки, чи достатньо даних прийшло. Якщо сума всіх dataLength більша за nBytes, буде кепсько.
2. Проголошуйте змінні разом з ініціалізацією в тому блоці, в якому вони будуть використовуватися:
do
{
int dataLength = BitConverter.ToUInt16(client.bufferReceive, startIndex);
3. fulllength в такому вигляді взагалі не потрібен - він завжди більший dataLength на 2 і ніде більше не використовується.
4. Ніколи не використовуйте "магічні числа":
Buffer.BlockCopy( client.bufferReceive, startIndex + sizeof( UInt16 ), arr, 0, dataLength );
5. Зверніть увагу на класи NetworkStream і TcpClient.
6. Не забувайте ставити else у взаємовиключних гілках - навіть якщо зараз вони взаємовиключаються умовами:
7. Дуже не бажано перехоплювати всі виключні ситуації. Якщо ви очікуєте чогось - це правильно його перехопити і обробити; але якщо станеться дійсно неочікувана ситуація - хай з нею розбирається те, що її очікувало, а не ваша заглушка.
0) Ну так я хочу отак зробити. Всі дані, котрі треба передавати, я поділяю на дві групи - дані про позицію/поворот персонажа і всі інші дані (використання вмінь, атака, повідомлення в чат і т.д.). Так от першу групу я хочу передавати по UDP, тому що там треба якнайшвидше передавати нову позицію, аби персонажи рухались біль-менш синхронізовано. А ще ж UDP використовують в голосових чатиках, тобто він забезпечує швидкість, але іноді дані можуть пошкоджуватись, тому я пошкодженні дані буду просто відкидати, і так, як частота відправки позиції буде великою, то це не дуже погано буде впливати на рухи персонажів. Я ще читав, що краще взагалі використовувати UDP і навішати на нього всі потрібні прибамбаси, котрі є в TCP, ну щоб було швидко і надійно. Але я трохи запутався з тим UDP - не знаю, що сервер має додавати в коллекцію з клієнтами, там же сокетів немає, якийсь EndPoint але один... ну таке.
1) Ну про це мені пан Torbins, здається, писав. Але поки я не зіштовхнувся з цією проблемою - дуже важко заставити себе написати так, як треба.
2) А чо так?
3) Ну це да, я просто спочатку пишу так, аби було зрозуміло, ну як в голові уявляю, так і роблю, а потім вже оптимізую, якщо є повторювані частини коду, то виношу їх в метод і все інше, це я потім зроблю.
4) Та це я теж знаю, сам не полюбляю отих маг. чисел, потім виправлю все.
5) А навіщо? От про NetworkStream не знаю, але TcpClient це ж просто клас, котрий працює з сокетами TCP, просто вже там якісь готові штуки в нього є. А я просто працюю з TCP сокетами, ну типу роблю те саме, що TcpClient, але по-своєму
6) Це теж оптимізація ага?
7) Окєй.