Udp

Сеть в Unity3D

Udp

Сообщение goshax 21 янв 2012, 15:33

Как реализовать на Unity взаимодействия по сети через стандартные классы для работы с сетью в Дот Нете?
goshax
UNец
 
Сообщения: 23
Зарегистрирован: 17 янв 2012, 11:40

Re: Udp

Сообщение Syberex 22 янв 2012, 02:43

Синтаксис:
Используется csharp
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections;
using UnityEngine;

public class Connect : MonoBehaviour
{
    public string serverIP = "127.0.0.1";
    public int  serverPort = 25001;

        public void OnGUI()
        {
            TcpClient tcpClient;
            NetworkStream networkStream;
            StreamReader streamReader;
            StreamWriter streamWriter;
            try
            {
                        tcpClient = new TcpClient(serverIP, serverPort);
                        networkStream = tcpClient.GetStream();
                        GUI.Label(new Rect(10, 10, 150, 20), "Client connected to the Server");
                       
                        streamReader = new StreamReader(networkStream);
                        streamWriter = new StreamWriter(networkStream);
                        streamWriter.WriteLine("Message from the Client...");
                        streamWriter.Flush();
                        GUI.Label(new Rect(10, 30, 150, 20), "Client send message...");
            }
            catch (SocketException ex)
            {
                        GUI.Label(new Rect(10, 10, 150, 20), "Connection error...");
                        Console.WriteLine(ex);
            }
                Console.Read();
        }
}


Это был мой первый скрипт в Unity и на C# тоже, так что не придирайтесь ;)
Но работу он свою сделал - соединился с моим Java-сервером, написанным ранее ...
Скрипт для TCP, с UDP самостоятельно думаю разберетесь ...

ЗЫ В Unity нет ДотНета, но есть Mono
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Udp

Сообщение Kavis 22 янв 2012, 17:36

Попробовал модифицировать скрипт
Но есть одно но при попытке чтения данных от сервера , точнее сервер их даже еще не отсылает просто добавил строку чтобы прочитать эти данные а Юнити при запуске виснет с этой строкой ReadMsg = streamReader.ReadLine();
А вот сам скрипт

Синтаксис:
Используется csharp
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections;
using UnityEngine;

public class Connect2 : MonoBehaviour {
        public string serverIP = "127.0.0.1";
        public string ReadMsg = "No message";
    public int  serverPort = 1024;
         public       TcpClient tcpClient;
     public       NetworkStream networkStream;
     public       StreamReader streamReader;
     public       StreamWriter streamWriter;
       
        // Use this for initialization
        void Start () {
        tcpClient = new TcpClient(serverIP, serverPort);
        networkStream = tcpClient.GetStream(); 
        }
       
        // Update is called once per frame
        void Update () {
            try
            {
                       // GUI.Label(new Rect(10, 10, 150, 20), "Client connected to the Server");
                       
                        streamReader = new StreamReader(networkStream);
                        streamWriter = new StreamWriter(networkStream);
                        streamWriter.WriteLine("Message from the Client...");
                        streamWriter.Flush();
               
                        //ReadMsg = streamReader.ReadToEnd();
                        ReadMsg = streamReader.ReadLine();
                       // GUI.Label(new Rect(10, 30, 150, 20), "Client send message...");
            }
            catch (SocketException ex)
            {
                       // GUI.Label(new Rect(10, 10, 150, 20), "Connection error...");
                        Console.WriteLine(ex);
            }
                Console.Read();
        }
       
        void OnGUI(){
                GUI.Label(new Rect(10, 30, 150, 20), ReadMsg);
        }
       
}
 
Аватара пользователя
Kavis
UNIт
 
Сообщения: 106
Зарегистрирован: 25 дек 2011, 17:25
Откуда: Воронеж
  • Сайт
  • ICQ

Re: Udp

Сообщение Syberex 22 янв 2012, 21:54

точнее сервер их даже еще не отсылает просто добавил строку чтобы прочитать эти данные а Юнити при запуске виснет

Ну вот и плохо, что не отсылает! (P)
Я же сказал, что не придирайтесь ... Во первых весь коннект засунут в OnGui(), это означет, что оно может отрабатывать по несколько раз за кадр @-) , а вы добавляете ReedLine() который некоторое время ждет строку - в итоге получаем бсконечный цикл с ожидаем, а ничего не приходит :D ... и Юнька подвисает.

Вот немного переделал скрипт:
Синтаксис:
Используется csharp
using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Collections;

using UnityEngine;



public class Connect : MonoBehaviour

{

    public string serverIP = "127.0.0.1";

    public int  serverPort = 25001;

   

    public String ReadMsg;

    public String ReadMsg2;



        public void OnGUI()

        {

                if (ReadMsg.Length == 0) {

                    TcpClient tcpClient;

                    NetworkStream networkStream;

                    StreamReader streamReader;

                    StreamWriter streamWriter;

                    try

                        {

                                tcpClient = new TcpClient(serverIP, serverPort);

                                networkStream = tcpClient.GetStream();

                                GUI.Label(new Rect(10, 10, 500, 20), "Client connected to the Server...");

                               

                                streamReader = new StreamReader(networkStream);

                                streamWriter = new StreamWriter(networkStream);

                               

                                streamWriter.WriteLine("status");

                                streamWriter.Flush ();

                                ReadMsg = streamReader.ReadLine();

                                GUI.Label (new Rect (10, 30, 500, 20), "Msg from server:" + ReadMsg+".");

                               

                                streamWriter.WriteLine("login user 123");

                                streamWriter.Flush();

                                ReadMsg2 = streamReader.ReadLine();

                                GUI.Label(new Rect(10, 60, 500, 20), "Msg from server:" + ReadMsg2+".");

                    }

                    catch (SocketException ex)

                    {

                                GUI.Label(new Rect(10, 10, 500, 20), "Connection error...");

                                Console.WriteLine(ex);

                    }

                        Console.Read();

                }

                else {
                        GUI.Label (new Rect (10, 10, 500, 20), "Client connected to the Server...");
                        GUI.Label (new Rect (10, 60, 500, 20), "Msg from server:" + ReadMsg2 + ".");
                        GUI.Label (new Rect (10, 30, 500, 20), "Msg from server:" + ReadMsg + ".");
                }
        }

}


Теперь он соединяется, а дальше выводятся только сообщения. И скрин процесса ;)
Вообщем скрипт сырой! Чтобы работать с ним дальше, нужно первым делом убрать коннект из OnGui(), сделать цикл чтения, можно блочно, а не строчно (ReadLine будет ждать символа конца строки). И конечно без сервера все это бесполезно :-w
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Udp

Сообщение Guyver 23 янв 2012, 07:32

чтобы синхронный сокет не уходил в вечный слип при чтении ... нужно использовать Socket.Select

либо перейти на Асинхронные сокеты.

примеры по обеим темам отлично гуглятся ... но на всякий случай

http://www.java2s.com/Code/CSharp/Netwo ... Server.htm
http://www.java2s.com/Code/CSharp/Netwo ... Client.htm

тут и селекты и синхронные-асинхронные сокеты.

лично я юзаю на стороне сервера асинхронные, на стороне клиента синхронные через селект (клиент без потоков)

-----------------------------------

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

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

если у вас игра через интернет, могут быть важные операции, которые гарантированно должны долететь до сервера и вернуться нужным клиентам .... нужен или Tcp или сложный механизм подтверждения успеха обмена данных.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Udp

Сообщение Syberex 23 янв 2012, 09:56

Точно у меня ява сервер использует асинхронный сокет, только писался он почти три года назад и я уже подзабыл :(
И да udp стоит использовать только как вторичный канал для быстрых данных, например перемещений объектов если их много и они икру мечут :))
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3