клиент сервер, вин сокеты, unity 3d
Добавлено: 21 янв 2018, 08:33
Привет всем, у меня такая проблема: когда жму на кнопку "регистрация" в клиенте юнити выскакивает ошибка (SocketException: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. ) Ссылается это всё дело на вот эту часть кода
дальше я приложу несколько скриптов из моего клиента на юнити
1. класс Client
класс ClientHandler
и собственно скрипт самой кнопки
StateObject, и классы упаковки, распаковки я пока не буду писать сюда, если понадобятся напишите.
Синтаксис:
Используется csharp
private void Send(byte[] buffer)
{
_clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), _clientSocket);
}
{
_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);
}
}
}
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();
}
}
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();
}
}
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, и классы упаковки, распаковки я пока не буду писать сюда, если понадобятся напишите.