Add Server and client
This commit is contained in:
parent
3d7c9e3f7f
commit
6258438d44
262 changed files with 2661 additions and 0 deletions
60
Unity network UDP/Assets/scripts/network/Client.cs
Normal file
60
Unity network UDP/Assets/scripts/network/Client.cs
Normal file
|
@ -0,0 +1,60 @@
|
|||
using System;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
|
||||
|
||||
class Client
|
||||
{
|
||||
private UdpClient client;
|
||||
private IPEndPoint ep;
|
||||
private Thread receiveThread;
|
||||
|
||||
private volatile Boolean connected = false;
|
||||
|
||||
public Client(String ip,int port)
|
||||
{
|
||||
ep = new IPEndPoint(IPAddress.Parse(ip), port);
|
||||
client = new UdpClient();
|
||||
receiveThread = new Thread(new ThreadStart(loop));
|
||||
Register.registerClass();
|
||||
}
|
||||
|
||||
public void connect()
|
||||
{
|
||||
client.Connect(ep);
|
||||
connected = true;
|
||||
receiveThread.Start();
|
||||
}
|
||||
|
||||
public void loop()
|
||||
{
|
||||
while (connected)
|
||||
{
|
||||
byte[] data = client.Receive(ref ep);
|
||||
DataBuffer dataBuffer = new DataBuffer(data);
|
||||
int id = dataBuffer.getInt();
|
||||
IPacket packet = (IPacket)Register.instantiate(id);
|
||||
packet.read(dataBuffer);
|
||||
packet.manage(data, this);
|
||||
}
|
||||
}
|
||||
|
||||
public void send(IPacket packet)
|
||||
{
|
||||
DataBuffer data = new DataBuffer();
|
||||
packet.write(data);
|
||||
client.Send(data.getData(), data.getData().Length);
|
||||
}
|
||||
|
||||
public void disconnect()
|
||||
{
|
||||
client.Close();
|
||||
connected = false;
|
||||
}
|
||||
|
||||
}
|
12
Unity network UDP/Assets/scripts/network/Client.cs.meta
Normal file
12
Unity network UDP/Assets/scripts/network/Client.cs.meta
Normal file
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6ef5ac19c402f2c42a01c3f10df1e3e0
|
||||
timeCreated: 1461077674
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
22
Unity network UDP/Assets/scripts/network/MainClient.cs
Normal file
22
Unity network UDP/Assets/scripts/network/MainClient.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
using UnityEngine;
|
||||
|
||||
class MainClient {
|
||||
|
||||
public static Client client;
|
||||
public static string pseudo;
|
||||
public static int connected = -1;
|
||||
|
||||
public static void connect (string host,int port,string pseudo) {
|
||||
client = new Client(host, port);
|
||||
client.connect();
|
||||
connected = 0;
|
||||
client.send(new MainState_Connection_Request_Packet(pseudo, 0));
|
||||
}
|
||||
|
||||
|
||||
public static void OnGUI()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
12
Unity network UDP/Assets/scripts/network/MainClient.cs.meta
Normal file
12
Unity network UDP/Assets/scripts/network/MainClient.cs.meta
Normal file
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 353dd1b92e911804cba3e451a2a5aa47
|
||||
timeCreated: 1461092835
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
9
Unity network UDP/Assets/scripts/network/common.meta
Normal file
9
Unity network UDP/Assets/scripts/network/common.meta
Normal file
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 49ebafc3208dd5e42b7dcba1440f6f45
|
||||
folderAsset: yes
|
||||
timeCreated: 1461077683
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
214
Unity network UDP/Assets/scripts/network/common/DataBuffer.cs
Normal file
214
Unity network UDP/Assets/scripts/network/common/DataBuffer.cs
Normal file
|
@ -0,0 +1,214 @@
|
|||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System;
|
||||
|
||||
public class DataBuffer{
|
||||
|
||||
//readonly constant static -> const non static
|
||||
public static readonly int SIZE = 1024;
|
||||
|
||||
private byte[] data;
|
||||
private int pointer;
|
||||
|
||||
public DataBuffer()
|
||||
{
|
||||
data = new byte[SIZE];
|
||||
pointer = 0;
|
||||
}
|
||||
|
||||
public DataBuffer(byte[] data)
|
||||
{
|
||||
this.data = data;
|
||||
pointer = 0;
|
||||
}
|
||||
|
||||
public void put(byte a)
|
||||
{
|
||||
if (pointer >= SIZE)
|
||||
{
|
||||
Debug.Log( "Databuffer write overflow");
|
||||
return;
|
||||
}
|
||||
data[pointer++] = a;
|
||||
}
|
||||
|
||||
public void put(sbyte a)
|
||||
{
|
||||
if (pointer >= SIZE)
|
||||
{
|
||||
Debug.Log("Databuffer write overflow");
|
||||
return;
|
||||
}
|
||||
data[pointer++] = (byte)a;
|
||||
}
|
||||
|
||||
public void put(short a)
|
||||
{
|
||||
put((byte)((a >> 8) & 0xff));
|
||||
put((byte)((a >> 0) & 0xff));
|
||||
}
|
||||
|
||||
public void put(int a)
|
||||
{
|
||||
put((byte)((a >> 24) & 0xff));
|
||||
put((byte)((a >> 16) & 0xff));
|
||||
put((byte)((a >> 8) & 0xff));
|
||||
put((byte)((a >> 0) & 0xff));
|
||||
}
|
||||
|
||||
public void put(long a)
|
||||
{
|
||||
put((byte)((a >> 56) & 0xff));
|
||||
put((byte)((a >> 48) & 0xff));
|
||||
put((byte)((a >> 40) & 0xff));
|
||||
put((byte)((a >> 32) & 0xff));
|
||||
put((byte)((a >> 24) & 0xff));
|
||||
put((byte)((a >> 16) & 0xff));
|
||||
put((byte)((a >> 8) & 0xff));
|
||||
put((byte)((a >> 0) & 0xff));
|
||||
}
|
||||
|
||||
public void put(float a)
|
||||
{
|
||||
byte[] array = BitConverter.GetBytes(a);
|
||||
foreach(byte b in array)
|
||||
{
|
||||
put(b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void put(double a)
|
||||
{
|
||||
byte[] array = BitConverter.GetBytes(a);
|
||||
foreach (byte b in array)
|
||||
{
|
||||
put(b);
|
||||
}
|
||||
}
|
||||
|
||||
public void put(char a)
|
||||
{
|
||||
put((byte)a);
|
||||
}
|
||||
|
||||
public void put(String a)
|
||||
{
|
||||
char[] b = a.ToCharArray();
|
||||
put(a.Length);
|
||||
for (int i = 0; i < a.Length; i++)
|
||||
{
|
||||
put(b[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public byte getByte()
|
||||
{
|
||||
if (pointer >= SIZE)
|
||||
{
|
||||
Debug.Log("Databuffer write overflow");
|
||||
return 0;
|
||||
}
|
||||
return data[pointer++];
|
||||
}
|
||||
|
||||
public sbyte getSByte()
|
||||
{
|
||||
if (pointer >= SIZE)
|
||||
{
|
||||
Debug.Log("Databuffer write overflow");
|
||||
return 0;
|
||||
}
|
||||
return (sbyte)data[pointer++];
|
||||
}
|
||||
|
||||
public short getShort()
|
||||
{
|
||||
return (short)((
|
||||
(getByte() << 8) & 0xff00) |
|
||||
(getByte() & 0xff));
|
||||
}
|
||||
|
||||
public int getInt()
|
||||
{
|
||||
return (int)((
|
||||
(getByte() << 24) & 0xff000000) |
|
||||
(getByte() << 16 & 0xff0000) |
|
||||
(getByte() << 8 & 0xff00) |
|
||||
(getByte() & 0xff));
|
||||
}
|
||||
|
||||
public long getLong()
|
||||
{
|
||||
return (long)(
|
||||
((ulong)((long)getByte() << 56) & 0xff00000000000000L) |
|
||||
((ulong)((long)getByte() << 48) & 0xff000000000000L) |
|
||||
((ulong)((long)getByte() << 40) & 0xff0000000000L) |
|
||||
(ulong)(((long)getByte() << 32) & 0xff00000000L) |
|
||||
((ulong)((long)getByte() << 24) & 0xff000000L) |
|
||||
((ulong)((long)getByte() << 16) & 0xff0000L) |
|
||||
((ulong)((long)getByte() << 8) & 0xff00L) |
|
||||
((ulong)(long)getByte() & 0xffL));
|
||||
}
|
||||
|
||||
public float getFloat()
|
||||
{
|
||||
byte[] array = new byte[4] { getByte(), getByte(), getByte(), getByte() };
|
||||
return BitConverter.ToSingle(array, 0);
|
||||
}
|
||||
|
||||
public double getDouble()
|
||||
{
|
||||
byte[] array = new byte[8] { getByte(), getByte(), getByte(), getByte(), getByte(), getByte(), getByte(), getByte() };
|
||||
return BitConverter.ToDouble(array, 0);
|
||||
}
|
||||
|
||||
public char getChar()
|
||||
{
|
||||
return (char)getByte();
|
||||
}
|
||||
|
||||
public String getString()
|
||||
{
|
||||
int size = getInt();
|
||||
char[] st = new char[size];
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
st[i] = getChar();
|
||||
}
|
||||
return new String(st);
|
||||
}
|
||||
|
||||
public byte[] getData()
|
||||
{
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(byte[] data)
|
||||
{
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public int getPointer()
|
||||
{
|
||||
return pointer;
|
||||
}
|
||||
|
||||
public void setPointer(int pointer)
|
||||
{
|
||||
this.pointer = pointer;
|
||||
}
|
||||
|
||||
public static int getSize()
|
||||
{
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public void clear()
|
||||
{
|
||||
pointer = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 078e293494940144a9d5d954dc84daed
|
||||
timeCreated: 1461077692
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
11
Unity network UDP/Assets/scripts/network/common/IPacket.cs
Normal file
11
Unity network UDP/Assets/scripts/network/common/IPacket.cs
Normal file
|
@ -0,0 +1,11 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
interface IPacket
|
||||
{
|
||||
void read(DataBuffer data);
|
||||
void write(DataBuffer data);
|
||||
void manage(byte[] data, Client client);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c5c6e5983b09e5b45a1c0ff1cb10f177
|
||||
timeCreated: 1461092836
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
36
Unity network UDP/Assets/scripts/network/common/Register.cs
Normal file
36
Unity network UDP/Assets/scripts/network/common/Register.cs
Normal file
|
@ -0,0 +1,36 @@
|
|||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System;
|
||||
|
||||
public class Register {
|
||||
|
||||
public static Type[] registeredClass;
|
||||
|
||||
public static void registerClass()
|
||||
{
|
||||
registeredClass = new Type[] {
|
||||
typeof(MessagePacket),
|
||||
typeof(MainState_Connection_Request_Packet),
|
||||
typeof(Disconnect_Client_Packet)
|
||||
};
|
||||
}
|
||||
|
||||
public static Type getClass(int id)
|
||||
{
|
||||
return registeredClass[id];
|
||||
}
|
||||
|
||||
public static int getId(Type cl)
|
||||
{
|
||||
for (int i = 0; i < registeredClass.Length; i++)
|
||||
{
|
||||
if (cl == registeredClass[i]) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static object instantiate(int id)
|
||||
{
|
||||
return getClass(id).GetConstructor(Type.EmptyTypes).Invoke(Type.EmptyTypes);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 7b248295a2003cb4f8f2c02963c4dc69
|
||||
timeCreated: 1461091725
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
9
Unity network UDP/Assets/scripts/network/packet.meta
Normal file
9
Unity network UDP/Assets/scripts/network/packet.meta
Normal file
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: eafcd88293cff404b855b1726af268b7
|
||||
folderAsset: yes
|
||||
timeCreated: 1461092835
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,39 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
class Disconnect_Client_Packet : IPacket
|
||||
{
|
||||
public string pseudo;
|
||||
|
||||
public Disconnect_Client_Packet() { }
|
||||
|
||||
public Disconnect_Client_Packet(string pseudo) { this.pseudo = pseudo; }
|
||||
|
||||
void IPacket.read(DataBuffer data)
|
||||
{
|
||||
this.pseudo = data.getString();
|
||||
}
|
||||
|
||||
void IPacket.write(DataBuffer data)
|
||||
{
|
||||
data.put(Register.getId(typeof(Disconnect_Client_Packet)));
|
||||
data.put(this.pseudo);
|
||||
}
|
||||
|
||||
void IPacket.manage(byte[] data, Client client)
|
||||
{
|
||||
if (pseudo.Equals(MainClient.pseudo))
|
||||
{
|
||||
MainClient.connected = MainState_Connection_Request_Packet.DISCONNECTED;
|
||||
MainClient.client.disconnect();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 09c2a6099528c8445b15ffe7adbde542
|
||||
timeCreated: 1461172729
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,57 @@
|
|||
using System;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
class MainState_Connection_Request_Packet : IPacket
|
||||
{
|
||||
|
||||
public static readonly int REQUEST = 0, ACCEPTED = 1, REFUSED = 2, TIME_OUT = 3, ALREADY_CONNECTED = 4, PSEUDO_INCORRECT = 5,DISCONNECTED = 6;
|
||||
|
||||
public String pseudo;
|
||||
public int id;
|
||||
|
||||
public MainState_Connection_Request_Packet() { }
|
||||
|
||||
public MainState_Connection_Request_Packet(String pseudo,int id)
|
||||
{
|
||||
this.pseudo = pseudo;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
void IPacket.write(DataBuffer data)
|
||||
{
|
||||
data.put(Register.getId(typeof(MainState_Connection_Request_Packet)));
|
||||
data.put(pseudo);
|
||||
data.put(id);
|
||||
}
|
||||
|
||||
void IPacket.read(DataBuffer data)
|
||||
{
|
||||
this.pseudo = data.getString();
|
||||
this.id = data.getInt();
|
||||
}
|
||||
|
||||
void IPacket.manage(byte[] data, Client client)
|
||||
{
|
||||
if(id == ACCEPTED)
|
||||
{
|
||||
MainClient.connected = ACCEPTED;
|
||||
MainClient.pseudo = this.pseudo;
|
||||
}
|
||||
else if(id == REFUSED)
|
||||
{
|
||||
MainClient.connected = REFUSED;
|
||||
}
|
||||
else if (id == ALREADY_CONNECTED)
|
||||
{
|
||||
MainClient.connected = ALREADY_CONNECTED;
|
||||
}
|
||||
else if (id == PSEUDO_INCORRECT)
|
||||
{
|
||||
MainClient.connected = PSEUDO_INCORRECT;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e632acbe3e907fb42992ec51c2549272
|
||||
timeCreated: 1461155199
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
class MessagePacket : IPacket
|
||||
{
|
||||
|
||||
private String pseudo, message;
|
||||
|
||||
public MessagePacket() { }
|
||||
|
||||
public MessagePacket(String pseudo, String message)
|
||||
{
|
||||
this.message = message;
|
||||
this.pseudo = pseudo;
|
||||
}
|
||||
|
||||
void IPacket.read(DataBuffer data)
|
||||
{
|
||||
this.pseudo = data.getString();
|
||||
this.message = data.getString();
|
||||
}
|
||||
|
||||
void IPacket.write(DataBuffer data)
|
||||
{
|
||||
data.put(Register.getId(typeof(MessagePacket)));
|
||||
data.put(this.pseudo);
|
||||
data.put(this.message);
|
||||
}
|
||||
|
||||
void IPacket.manage(byte[] data,Client client)
|
||||
{
|
||||
Debug.Log(this.pseudo + " : " + this.message);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6df0f62eafd1c224ea52a0721bc3e4b1
|
||||
timeCreated: 1461092835
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,27 @@
|
|||
using UnityEngine;
|
||||
using System.Collections;
|
||||
|
||||
public class PingPacket : IPacket {
|
||||
|
||||
public long current;
|
||||
|
||||
public PingPacket()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void IPacket.read(DataBuffer data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void IPacket.write(DataBuffer data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void IPacket.manage(byte[] data, Client client)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6c3875a60f90ff146950d2ad190f0e09
|
||||
timeCreated: 1462518396
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in a new issue