клиент сервер, вин сокеты, unity 3d

Сеть в Unity3D

клиент сервер, вин сокеты, unity 3d

Сообщение -Шум- 21 янв 2018, 08:33

Привет всем, у меня такая проблема: когда жму на кнопку "регистрация" в клиенте юнити выскакивает ошибка (SocketException: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. ) Ссылается это всё дело на вот эту часть кода
Синтаксис:
Используется csharp
private void Send(byte[] buffer)
    {
        _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), _clientSocket);
    }
 


дальше я приложу несколько скриптов из моего клиента на юнити
1. класс Client
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System;
using System.Linq;
using System.Text;
using System.Threading;

//====================================================================================================================================
//=========================================================Сетевой Менеджер===========================================================
//====================================================================================================================================
public class Client
{
    private Socket _clientSocket;
    private IPEndPoint _ipAddr;

    //==========================================Конструктор Класса Clint с Настройкой Сокета==========================================
    public Client(string ipAddr, int port)
    {
        _ipAddr = new IPEndPoint(IPAddress.Parse(ipAddr), port);
        _clientSocket = new Socket(_ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    }

    //===============================================Публичная Обёртка Методов Класса=================================================
    public void OnConnect()
    {
        Connect();
    }

    public void OnDisconnect()
    {
        Disconnect();
    }
    public void OnSend(byte[] data)
    {
        Send(data);
    }

    public void OnReceive()
    {
        Receive();
    }
    //================================================================================================================================

    //====================================================Приватные Методы Класса=====================================================
    //==========================================================Подключение===========================================================
    private void Connect()
    {
        _clientSocket.BeginConnect(_ipAddr, new AsyncCallback(ConnectCallBack), _clientSocket);
    }

    //============================================Завершение Асинхронного Метода Подключения==========================================
    private void ConnectCallBack(IAsyncResult ar)
    {
        Socket s = (Socket)ar.AsyncState;
        _clientSocket.EndConnect(ar);
        //================================================Продолжить прием данных=====================================================
        Receive();
    }

    //==========================================================Отключение============================================================
    private void Disconnect()
    {
        _clientSocket.BeginDisconnect(false, new AsyncCallback(DisconnectCallBack), _clientSocket);
    }

    //=============================================Завершение Асинхронного Метода Отключения==========================================
    private void DisconnectCallBack(IAsyncResult ar)
    {
        Socket s = ar.AsyncState as Socket;
        s.EndDisconnect(ar);
        Console.WriteLine("соединение разорвано");
    }

    //=======================================================Отправка Сообщения=======================================================
    private void Send(byte[] buffer)
    {
        _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), _clientSocket);
    }

    //=======================================Завершение Асинхронного Метода Отправки Сообщения========================================
    private void SendCallBack(IAsyncResult ar)
    {
        Socket s = ar.AsyncState as Socket;
        s.EndSend(ar);
        //================================================Продолжить прием данных=====================================================
        Receive();
    }

    //=========================================================Чтение Данных==========================================================
    private void Receive()
    {
        StateObject state = new StateObject();
        state.workSocket = _clientSocket;
        state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None,
                                                      new AsyncCallback(ReceiveCallBack), state);
    }

    //===========================================Завершение Асинхронного Метода Чтения Данных=========================================
    private void ReceiveCallBack(IAsyncResult ar)
    {
        try
        {
            StateObject state = ar.AsyncState as StateObject;

            Socket s = state.workSocket;

            if (s.Connected)
            {
                //кол-во принятых байт
                int bytes = s.EndReceive(ar);
                if (bytes > 0)
                {
                    Debug.Log("Данные были успешно получены!");

                    string cmd = String.Empty;
                    Buffer.BlockCopy(state.buffer, 0, state.workBuffer, 0, state.buffer.Length);
                    cmd = Encoding.UTF8.GetString(state.workBuffer, 0, bytes);

                    if (!String.IsNullOrEmpty(cmd))
                    {
                        ClientUnPacker unpack = new ClientUnPacker();
                        unpack.OperationUnpack(state.workBuffer);
                    }
                    else
                    {
                        Debug.Log("Никаких данных не поступало!");
                        s.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.Log("Error: " + ex.Message + "\nStackTrace:\n" + ex.StackTrace);
        }
    }
}
 

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

public class ClientHandler
{
    private string ip = "127.0.0.1";
    private int port = 5555;

    private delegate void ConnectionDeleg();
    private delegate void DisconnectDeleg();
    private delegate void SendMessagDeleg(byte[] data);
    private delegate void ReceiveDeleg();

    private ConnectionDeleg _connect;
    private DisconnectDeleg _disconnect;
    private SendMessagDeleg _send;
    private ReceiveDeleg _receive;

    public ClientHandler()
    {
        Client Networker = new Client(ip, port);

        ConnectionDeleg Conncect = new ConnectionDeleg(Networker.OnConnect);
        _connect = Conncect;

        DisconnectDeleg Disconnect = new DisconnectDeleg(Networker.OnDisconnect);
        _disconnect = Disconnect;

        SendMessagDeleg Send = new SendMessagDeleg(Networker.OnSend);
        _send = Send;

        ReceiveDeleg Receive = new ReceiveDeleg(Networker.OnReceive);
        _receive = Receive;

    }
    public void OnConnection()
    {
        _connect();
    }
    public void OnDisconnect()
    {
        _disconnect();
    }
    public void OnSendMessage(byte[] data)
    {
        _send(data);
    }
    public void OnReceive()
    {
        _receive();
    }
}

 

и собственно скрипт самой кнопки
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Net;
using System.Net.Sockets;
using System;
using System.Linq;
using System.Text;
using System.Threading;

public class Registration : MonoBehaviour
{
    public InputField InputLogin;
    public InputField InputPassword;
    public InputField InputMail;

    public void _Registration()
    {
        string login = InputLogin.text;
        string password = InputPassword.text;
        string mail = InputMail.text;

        ClientPacker package = new ClientPacker();
        byte[] data = package.DataPackReg(login, password, mail);

        ClientHandler handler = new ClientHandler();
        handler.OnConnection();
        handler.OnSendMessage(data);
        handler.OnDisconnect();
    }
}

 

StateObject, и классы упаковки, распаковки я пока не буду писать сюда, если понадобятся напишите.
-Шум-
UNец
 
Сообщения: 11
Зарегистрирован: 31 май 2017, 05:56

Re: клиент сервер, вин сокеты, unity 3d

Сообщение IDoNotExist 22 янв 2018, 13:00

На глаз могу предположить что пытаетесь отправить данные не дождавшись поключения, у вас же оно асинхронное, вы нигде не синхронизируете состояние клиента, советую почитать про потоки. Да и вообще, зачем вам этот гемор с сокетами, используйте TcpClient.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: клиент сервер, вин сокеты, unity 3d

Сообщение -Шум- 22 янв 2018, 17:14

IDoNotExist писал(а):На глаз могу предположить что пытаетесь отправить данные не дождавшись поключения, у вас же оно асинхронное, вы нигде не синхронизируете состояние клиента, советую почитать про потоки. Да и вообще, зачем вам этот гемор с сокетами, используйте TcpClient.

возможно нужно блокировтаь управление и не отдавать его. пока не завершится асинхронный коннект? это вы подрузомеваете под синхронизацией?
-Шум-
UNец
 
Сообщения: 11
Зарегистрирован: 31 май 2017, 05:56


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

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

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