Add uninitializing and make client stop on disconnect
This commit is contained in:
parent
c44813d0d2
commit
545a3cc5c5
@ -2,6 +2,7 @@
|
|||||||
using Network.PacketHandling;
|
using Network.PacketHandling;
|
||||||
using Network.PacketHandling.Packets;
|
using Network.PacketHandling.Packets;
|
||||||
using System;
|
using System;
|
||||||
|
using Util;
|
||||||
|
|
||||||
namespace Network {
|
namespace Network {
|
||||||
public class Client : Peer {
|
public class Client : Peer {
|
||||||
@ -24,6 +25,13 @@ namespace Network {
|
|||||||
StartListening(port, "*");
|
StartListening(port, "*");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Uninitialize() {
|
||||||
|
if (ConnectionList.Contains(ServerConn)) {
|
||||||
|
Disconnect(ServerConn, DisconnectReason.MANUAL_DISCONNECT);
|
||||||
|
}
|
||||||
|
StopListening();
|
||||||
|
}
|
||||||
|
|
||||||
public override void Process(float delta) {
|
public override void Process(float delta) {
|
||||||
Timer += delta;
|
Timer += delta;
|
||||||
if (Timer > 10) {
|
if (Timer > 10) {
|
||||||
@ -41,6 +49,7 @@ namespace Network {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override void Disconnected(Connection conn) {
|
public override void Disconnected(Connection conn) {
|
||||||
|
Stop(); // Stop the client if it disconnects.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -28,13 +28,13 @@ namespace Network {
|
|||||||
public void StartClient(string address, int port) {
|
public void StartClient(string address, int port) {
|
||||||
if (IsClient || IsServer) { return; }
|
if (IsClient || IsServer) { return; }
|
||||||
Client = new Client(PacketPeer);
|
Client = new Client(PacketPeer);
|
||||||
Client.Initialize(address, port);
|
Client.Start(address, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartServer(string address, int port) {
|
public void StartServer(string address, int port) {
|
||||||
if (IsClient || IsServer) { return; }
|
if (IsClient || IsServer) { return; }
|
||||||
Server = new Server(PacketPeer);
|
Server = new Server(PacketPeer);
|
||||||
Server.Initialize(address, port);
|
Server.Start(address, port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ namespace Network {
|
|||||||
private static PacketPeerUDP PacketPeer;
|
private static PacketPeerUDP PacketPeer;
|
||||||
private static Peer Singleton;
|
private static Peer Singleton;
|
||||||
public readonly bool IsServer;
|
public readonly bool IsServer;
|
||||||
|
private bool Initialized = false;
|
||||||
|
|
||||||
public Protocol Protocol;
|
public Protocol Protocol;
|
||||||
|
|
||||||
@ -23,6 +24,8 @@ namespace Network {
|
|||||||
public ConnectionList ConnectionList;
|
public ConnectionList ConnectionList;
|
||||||
public PacketDistributor PacketDistributor;
|
public PacketDistributor PacketDistributor;
|
||||||
|
|
||||||
|
private bool ShouldListen = false;
|
||||||
|
|
||||||
public Peer(PacketPeerUDP packetPeer, bool isServer) {
|
public Peer(PacketPeerUDP packetPeer, bool isServer) {
|
||||||
PacketPeer = packetPeer;
|
PacketPeer = packetPeer;
|
||||||
IsServer = isServer;
|
IsServer = isServer;
|
||||||
@ -36,7 +39,19 @@ namespace Network {
|
|||||||
Process(delta);
|
Process(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Start(string address, int port) {
|
||||||
|
Singleton = this;
|
||||||
|
Initialize(address, port);
|
||||||
|
Initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop() {
|
||||||
|
Uninitialize();
|
||||||
|
Initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void Initialize(string address, int port);
|
public abstract void Initialize(string address, int port);
|
||||||
|
public abstract void Uninitialize();
|
||||||
public abstract void Process(float delta);
|
public abstract void Process(float delta);
|
||||||
public abstract void Connected(Connection conn);
|
public abstract void Connected(Connection conn);
|
||||||
public abstract void Disconnected(Connection conn);
|
public abstract void Disconnected(Connection conn);
|
||||||
@ -54,7 +69,7 @@ namespace Network {
|
|||||||
GD.printerr("The Peer is already listening or the thread is active!");
|
GD.printerr("The Peer is already listening or the thread is active!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Singleton = this;
|
ShouldListen = true;
|
||||||
PacketPeer.Listen(port, address);
|
PacketPeer.Listen(port, address);
|
||||||
ThreadStart ChildRef = new ThreadStart(ListenerThreadMethod);
|
ThreadStart ChildRef = new ThreadStart(ListenerThreadMethod);
|
||||||
ListenerThread = new Thread(ChildRef);
|
ListenerThread = new Thread(ChildRef);
|
||||||
@ -62,10 +77,18 @@ namespace Network {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void StopListening() {
|
||||||
|
if (ShouldListen) {
|
||||||
|
ShouldListen = false;
|
||||||
|
PacketPeer.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static void ListenerThreadMethod() {
|
private static void ListenerThreadMethod() {
|
||||||
GD.print("Started Listener Thread.");
|
GD.print("Started Listener Thread.");
|
||||||
|
|
||||||
while (true) {
|
while (Singleton.ShouldListen) {
|
||||||
|
|
||||||
PacketPeer.Wait();
|
PacketPeer.Wait();
|
||||||
byte[] Buffer = PacketPeer.GetPacket();
|
byte[] Buffer = PacketPeer.GetPacket();
|
||||||
@ -104,6 +127,10 @@ namespace Network {
|
|||||||
GD.print("TIMEOUT");
|
GD.print("TIMEOUT");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case DisconnectReason.MANUAL_DISCONNECT: {
|
||||||
|
GD.print("MANUAL DISCONNECT");
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
GD.print("Unknown.");
|
GD.print("Unknown.");
|
||||||
break;
|
break;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using Godot;
|
using Godot;
|
||||||
using Network.PacketHandling;
|
using Network.PacketHandling;
|
||||||
using System.Threading;
|
using Util;
|
||||||
|
|
||||||
namespace Network {
|
namespace Network {
|
||||||
public class Server : Peer {
|
public class Server : Peer {
|
||||||
@ -25,6 +25,13 @@ namespace Network {
|
|||||||
GD.print("Started server on " + address + ":" + port);
|
GD.print("Started server on " + address + ":" + port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Uninitialize() {
|
||||||
|
StopListening();
|
||||||
|
for (int i = 0; i < ConnectionList.Length; i++) {
|
||||||
|
Disconnect(ConnectionList[i], DisconnectReason.MANUAL_DISCONNECT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void Process(float delta) {
|
public override void Process(float delta) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
namespace Util {
|
namespace Util {
|
||||||
public enum DisconnectReason {
|
public enum DisconnectReason {
|
||||||
TIMEOUT
|
TIMEOUT, MANUAL_DISCONNECT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user