Skip to content

Instantly share code, notes, and snippets.

@jagt
Created June 21, 2016 06:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jagt/6f5a9f497f1650b8bc1fe092145a1514 to your computer and use it in GitHub Desktop.
Save jagt/6f5a9f497f1650b8bc1fe092145a1514 to your computer and use it in GitHub Desktop.
uNet LLAPI working kitchen sink
using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using System.Collections.Generic;
public class MonoLLAPI : MonoBehaviour {
int reliableStateUpdateChannel;
int unreliableChannel;
int port = 54231;
HostTopology ht;
private enum State
{
Idle,
ClientConnected,
ServerHosted,
}
private State _state;
private string _sendString = "send string";
private int _sockedID;
private int _connID;
private List<string> _received;
private UTF8Encoding utf8;
// Use this for initialization
void Start () {
GlobalConfig netConfig = new GlobalConfig();
NetworkTransport.Init(netConfig);
ConnectionConfig conConfig = new ConnectionConfig();
reliableStateUpdateChannel = conConfig.AddChannel(QosType.ReliableStateUpdate);
unreliableChannel = conConfig.AddChannel(QosType.Unreliable);
ht = new HostTopology(conConfig, 5);
utf8 = new UTF8Encoding();
_received = new List<string>();
return;
}
// Update is called once per frame
void Update () {
int hostID;
int connID;
int channelID;
int dataSize;
byte[] buffer = new byte[1024];
byte error;
if (_state == State.ServerHosted)
{
NetworkEventType networkEvent = NetworkEventType.DataEvent;
while (networkEvent != NetworkEventType.Nothing)
{
networkEvent = NetworkTransport.Receive(out hostID, out connID, out channelID, buffer, 1024, out dataSize, out error);
switch (networkEvent)
{
// ignore connection events for now
case NetworkEventType.DataEvent:
case NetworkEventType.BroadcastEvent:
string recvStr = utf8.GetString(buffer, 0, dataSize);
_received.Add(recvStr);
break;
case NetworkEventType.ConnectEvent:
_received.Add("connected! " + connID);
break;
}
}
}
else if (_state == State.ClientConnected)
{
NetworkEventType networkEvent = NetworkEventType.DataEvent;
while (networkEvent != NetworkEventType.Nothing)
{
networkEvent = NetworkTransport.Receive(out hostID, out connID, out channelID, buffer, 1024, out dataSize, out error);
switch (networkEvent)
{
case NetworkEventType.ConnectEvent:
// !!! needs to receive to really enable this connection
Debug.Log("connect of: " + connID);
break;
default:
break;
}
}
}
return;
}
void OnGUI()
{
GUILayout.BeginArea(new Rect(10, 10, 400, 400));
if (_state == State.Idle)
{
if (GUILayout.Button("Start As Server"))
{
_sockedID = NetworkTransport.AddHost(ht, port);
if (_sockedID < 0)
{
throw new System.Exception("socket open fail: " + _sockedID);
}
_state = State.ServerHosted;
}
if (GUILayout.Button("Start As Client"))
{
_sockedID = NetworkTransport.AddHost(ht);
if (_sockedID < 0)
{
throw new System.Exception("socket open fail: " + _sockedID);
}
byte err;
_connID = NetworkTransport.Connect(_sockedID, "127.0.0.1", port, 0, out err);
if (err != (byte)NetworkError.Ok)
{
throw new System.Exception("client connection fail :" + err);
}
_state = State.ClientConnected;
}
}
else if (_state == State.ClientConnected)
{
_sendString = GUILayout.TextField(_sendString);
if (GUILayout.Button("Send"))
{
byte[] bytes = utf8.GetBytes(_sendString);
byte err;
Debug.Log(string.Format("{0}, {1}", _sockedID, _connID));
bool sent = NetworkTransport.Send(_sockedID, _connID, reliableStateUpdateChannel, bytes, bytes.Length, out err);
if (!sent)
throw new System.Exception("send fail :" + err);
if (err != (byte)NetworkError.Ok)
throw new System.Exception("wtf :" + err);
}
}
else if (_state == State.ServerHosted)
{
foreach (var str in _received)
{
GUILayout.Label(str);
}
}
GUILayout.EndArea();
return;
}
void OnDisable()
{
NetworkTransport.Shutdown();
return;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment