diff --git a/DangerousD/GameCore/GUI/LobbyGUI.cs b/DangerousD/GameCore/GUI/LobbyGUI.cs index 90ba3c9..1d8a2e1 100644 --- a/DangerousD/GameCore/GUI/LobbyGUI.cs +++ b/DangerousD/GameCore/GUI/LobbyGUI.cs @@ -135,6 +135,7 @@ namespace DangerousD.GameCore.GUI }; Elements.Add(joinByIpButton); joinByIpButton.LeftButtonPressed += () => { + AppManager.Instance.ChangeGameState(GameState.Game); AppManager.Instance.NetworkManager.ClientInit(searchBarTextBox.text); }; } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 06c6f79..7689727 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -23,7 +23,7 @@ namespace DangerousD.GameCore public class AppManager : Game { public static AppManager Instance { get; private set; } - public string IpAddress { get; private set; } = "127.0.0.1"; + public string IpAddress { get; private set; } = "0.0.0.0"; private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; public GameState gameState { get; private set; } @@ -220,6 +220,7 @@ namespace DangerousD.GameCore public void NetworkSync(List networkTasks) { + DebugHUD.Log("networksync"); foreach (NetworkTask networkTask in networkTasks) { switch (networkTask.operation) diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 8d1c7c4..f4eed81 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -30,6 +30,9 @@ namespace DangerousD.GameCore public List otherObjects = new(); public Vector4 CameraBorder; public Player GetPlayer1 { get; private set; } + private int _lastUpdate = 0; + private int _currTime = 0; + public GameManager() { others = new List(); @@ -130,10 +133,16 @@ namespace DangerousD.GameCore public void Update(GameTime gameTime) { + _currTime += gameTime.ElapsedGameTime.Milliseconds; if (AppManager.Instance.NetworkTasks.Count > 0) { - AppManager.Instance.NetworkManager.SendMsg(AppManager.Instance.NetworkTasks.ToList()); - AppManager.Instance.NetworkTasks.Clear(); + if (_currTime - _lastUpdate > 50) + { + AppManager.Instance.DebugHUD.Log("sending"); + AppManager.Instance.NetworkManager.SendMsg(AppManager.Instance.NetworkTasks.ToList()); + AppManager.Instance.NetworkTasks.Clear(); + _lastUpdate = _currTime; + } } foreach (var item in BackgroundObjects) item.Update(gameTime); diff --git a/DangerousD/GameCore/Network/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs index 56ac3a1..41b48f1 100644 --- a/DangerousD/GameCore/Network/NetworkManager.cs +++ b/DangerousD/GameCore/Network/NetworkManager.cs @@ -21,27 +21,19 @@ namespace DangerousD.GameCore.Network private void Init(string IpAddress) { - try - { - socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - IPAddress address = IPAddress.Parse(IpAddress); - int port = 51873; - endPoint = new IPEndPoint(address, port); - } - catch { } + socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPAddress address = IPAddress.Parse(IpAddress); + int port = 51873; + endPoint = new IPEndPoint(address, port); } private void AcceptSockets() { while (true) { - try - { - Socket clientSocket = socket.Accept(); - clientSockets.Add(clientSocket); - Thread receiveThread = new Thread(BeginHostReceive); - receiveThread.Start(clientSocket); - } - catch { } + Socket clientSocket = socket.Accept(); + clientSockets.Add(clientSocket); + Thread receiveThread = new Thread(BeginHostReceive); + receiveThread.Start(clientSocket); } } @@ -50,46 +42,41 @@ namespace DangerousD.GameCore.Network Socket clientSocket = clSocket as Socket; while (clientSocket != null) { - try + byte[] bytesCount = new byte[4]; + clientSocket.Receive(bytesCount); + int length = BitConverter.ToInt32(bytesCount); + byte[] Data = new byte[length]; + StateObject so = new StateObject(clientSocket, Data); + while (so.UploadedBytesCount < length) { - byte[] bytesCount = new byte[4]; - clientSocket.Receive(bytesCount); - byte[] Data = new byte[BitConverter.ToInt32(bytesCount)]; - StateObject so = new StateObject(clientSocket, Data); - IAsyncResult count = clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so); + int count = clientSocket.Receive(so.buffer, so.UploadedBytesCount, length - so.UploadedBytesCount, SocketFlags.None); + so.UploadedBytesCount += count; } - catch { } + List tasks = JsonConvert.DeserializeObject>(Encoding.Unicode.GetString(so.buffer, 0, length)); + GetReceivingMessages(tasks); } } public void HostInit(string IpAddress) { - try - { - Init(IpAddress); - socket.Bind(endPoint); - socket.Listen(4); - Thread acceptThread = new Thread(AcceptSockets); - acceptThread.Start(); - state = "Host"; - AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Host); - } - catch { } + Init(IpAddress); + socket.Bind(endPoint); + socket.Listen(4); + Thread acceptThread = new Thread(AcceptSockets); + acceptThread.Start(); + state = "Host"; + AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Host); } public void ClientInit(string IpAddress) { - try - { - Init(IpAddress); - socket.Connect(endPoint); - state = "Client"; - Thread.Sleep(10); - Thread ReceivingThread = new Thread(ReceiveMsgFromHost); - ReceivingThread.Start(); - NetworkTask connectionTask = new NetworkTask("Player"); - AppManager.Instance.NetworkTasks.Add(connectionTask); - AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Client); - } - catch { } + Init(IpAddress); + socket.Connect(endPoint); + state = "Client"; + Thread.Sleep(10); + Thread ReceivingThread = new Thread(ReceiveMsgFromHost); + ReceivingThread.Start(); + NetworkTask connectionTask = new NetworkTask("Player"); + AppManager.Instance.NetworkTasks.Add(connectionTask); + AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.Client); } public void SendMsg(List networkTask, Socket ignoreSocket = null) { @@ -97,65 +84,38 @@ namespace DangerousD.GameCore.Network int count = Data.Length; if (state == "Host") { - try + foreach (Socket socket in clientSockets) { - foreach (Socket socket in clientSockets) + if (!(socket == ignoreSocket)) { - if (!(socket == ignoreSocket)) - { - socket.Send(BitConverter.GetBytes(count)); - socket.Send(Data); - } + socket.Send(BitConverter.GetBytes(count)); + socket.Send(Data); } } - catch { } } else { - try - { - socket.Send(BitConverter.GetBytes(count)); - socket.Send(Data); - } - catch { } + socket.Send(BitConverter.GetBytes(count)); + socket.Send(Data); } } private void ReceiveMsgFromHost() { while (true) { - try + byte[] bytesCount = new byte[4]; + socket.Receive(bytesCount); + int length = BitConverter.ToInt32(bytesCount); + byte[] Data = new byte[length]; + StateObject so = new StateObject(socket, Data); + while (so.UploadedBytesCount < length) { - byte[] bytesCount = new byte[4]; - socket.Receive(bytesCount); - byte[] Data = new byte[BitConverter.ToInt32(bytesCount)]; - StateObject so = new StateObject(socket, Data); - IAsyncResult count = socket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so); + int count = socket.Receive(so.buffer, so.UploadedBytesCount, length-so.UploadedBytesCount, SocketFlags.None); + so.UploadedBytesCount += count; } - catch { } + List tasks = JsonConvert.DeserializeObject>(Encoding.Unicode.GetString(so.buffer, 0, length)); + GetReceivingMessages(tasks); } } - - private void AsyncReceiveCallback(IAsyncResult ar) - { - try - { - StateObject so = ar.AsyncState as StateObject; - Socket clientSocket = so.workSocket; - int readCount = clientSocket.EndReceive(ar); - so.UploadedBytesCount += readCount; - so.sb.Append(Encoding.Unicode.GetString(so.buffer, 0, readCount)); - if (so.UploadedBytesCount < so.bufferSize) - { - clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), so); - } - else - { - List tasks = JsonConvert.DeserializeObject>(so.sb.ToString()); - GetReceivingMessages(tasks); - } - } - catch { } - } } } diff --git a/DangerousD/GameCore/Network/StateObject.cs b/DangerousD/GameCore/Network/StateObject.cs index f98170b..3648ad1 100644 --- a/DangerousD/GameCore/Network/StateObject.cs +++ b/DangerousD/GameCore/Network/StateObject.cs @@ -12,7 +12,6 @@ namespace DangerousD.GameCore.Network public Socket workSocket; public int bufferSize; public byte[] buffer; - public StringBuilder sb = new StringBuilder(); public int UploadedBytesCount; public StateObject(Socket socket, byte[] buffer)