Реализация приема/передачи

Сеть в Unity3D

Реализация приема/передачи

Сообщение mastersmit 29 июл 2016, 05:09

Написал значит код для сервера и клиента, которые пока отправляют/принимают некоторое значение float.

Синтаксис:
Используется csharp
class Program {
static void Main(string[] args) {// устанавливаю для сокета локальную конечную точку

IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // создание сокета

// Назначение сокета локальной конечной точке, слушаю входящие сокеты
try {
sListener.Bind(ipEndPoint);
sListener.Listen(10);

// Начало слушать соединения
while (true) {
Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);

// Программа приостанавливается, ожидая входящее соединение
Socket handler = sListener.Accept();
string data = null;

// Дождался клиента, пытающегося с соединиться

byte[] bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);

data += BitConverter.ToSingle(bytes, 0);

// Отправляю данные в консоль
Console.Write("Полученные данные: " + data + "\n\n");

// Отправляю ответ клиенту
handler.Send(msg);

handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
} finally {
Console.ReadLine();
}
}
}


Клиент:
Синтаксис:
Используется csharp
Transform tr; // Наша трансформа

void Start () {
tr = GetComponent<Transform>();
StartCoroutine(send()); // Запускаю цикл отправки/приема данных
}

IEnumerator send() {
// Устанавливаю удаленную точку для сокета
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
Debug.Log("Точка установлена");
byte[] bytes = new byte[1024];
while (true) {
Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
sender.Connect(ipEndPoint);
SendMessageFromSocket(sender, bytes);
yield return null;
}
// Освобождаю сокет

yield break;
}


void SendMessageFromSocket(Socket s, byte[] b) {
float message = 0;

// Соединяю с удаленным устройством

if (Input.GetKey(KeyCode.RightArrow)) {
message = 0.1f;
}
if(Input.GetKey(KeyCode.LeftArrow)) {
message = -0.1f;
}

byte[] msg = BitConverter.GetBytes(message); // конвертирую float в bytes[]

int bytesSent = s.Send(msg); // отправляю их на сервер

int bytesRec = s.Receive(b); // получаю это же значение обратно
tr.position = new Vector3(tr.position.x + (BitConverter.ToSingle(msg, 0) * Time.deltaTime), tr.position.y, tr.position.z); // ну и двигаю трансформу, конвертируя полученный набор bytes[] во float
Debug.Log("Ответ от сервера: " + Encoding.UTF8.GetString(b, 0, bytesRec));
s.Shutdown(SocketShutdown.Both);
s.Close();

}


Как бы в целом все работает. Хотелось просто немного прояснить - правилен ли данный подход? А именно чтобы переместиться идет конвертация в bytes[], потом отправка на сервер, потом прием этого же значения обратно, опять конвертация в float и назначение..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Реализация приема/передачи

Сообщение Diab10 29 июл 2016, 13:11

mastersmit писал(а):
Как бы в целом все работает. Хотелось просто немного прояснить - правилен ли данный подход? А именно чтобы переместиться идет конвертация в bytes[], потом отправка на сервер, потом прием этого же значения обратно, опять конвертация в float и назначение..


Код не разбирал, но идея верная. Только ещё заголовки нужно добавлять в тело сообщения, и проверять по заголовкам - весь ли пакет дошёл, или ещё нет.
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Реализация приема/передачи

Сообщение mastersmit 29 июл 2016, 14:09

Спасибо за ответ. А в чем разница между BitConverter.ToString() и Encoding.UTF8.GetBytes(), возвращают разные значения.
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край


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

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

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


cron