diff --git a/DangerousD/GameCore/Managers/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs similarity index 53% rename from DangerousD/GameCore/Managers/NetworkManager.cs rename to DangerousD/GameCore/Network/NetworkManager.cs index 6c789df..a619e33 100644 --- a/DangerousD/GameCore/Managers/NetworkManager.cs +++ b/DangerousD/GameCore/Network/NetworkManager.cs @@ -1,14 +1,13 @@ -using Microsoft.Xna.Framework; -using System.Net.Sockets; +using System.Net.Sockets; using System.Net; -using System.Collections.Generic; using System.Text; +using System.Collections.Generic; using System.Threading; using System; -namespace DangerousD.GameCore +namespace DangerousD.GameCore.Network { - class NetworkManager + public class NetworkManagerTest { public delegate void ReceivingHandler(string msg); @@ -17,7 +16,6 @@ namespace DangerousD.GameCore Socket socket; IPEndPoint endPoint; List clientSockets = new List(); - Socket HostSocket; string state; private void Init(string IpAddress) @@ -44,10 +42,11 @@ namespace DangerousD.GameCore Socket clientSocket = clSocket as Socket; while (clientSocket != null) { - byte[] Data = new byte[256]; - int count = clientSocket.Receive(Data); - string msg = Encoding.Unicode.GetString(Data, 0, count); - GetMsg(msg); + 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); } } public void HostInit(string IpAddress) @@ -66,27 +65,54 @@ namespace DangerousD.GameCore socket.Connect(endPoint); state = "Client"; Thread.Sleep(10); + Thread ReceivingThread = new Thread(ReceiveMsgFromHost); + ReceivingThread.Start(); } public void SendMsg(string msg) { byte[] Data = Encoding.Unicode.GetBytes(msg); + int count = Data.Length; if (state == "Host") { foreach (Socket socket in clientSockets) { + socket.Send(BitConverter.GetBytes(count)); socket.Send(Data); } } else { + socket.Send(BitConverter.GetBytes(count)); socket.Send(Data); } } - public string ReceiveMsgFromHost() + public void ReceiveMsgFromHost() { - byte[] Data = new byte[256]; - int count = socket.Receive(Data); - return Encoding.Unicode.GetString(Data, 0, count); + while (true) + { + 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); + } + } + + public void AsyncReceiveCallback(IAsyncResult ar) + { + 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 + { + GetMsg(so.sb.ToString()); + } } } } diff --git a/DangerousD/GameCore/Network/StateObject.cs b/DangerousD/GameCore/Network/StateObject.cs new file mode 100644 index 0000000..f98170b --- /dev/null +++ b/DangerousD/GameCore/Network/StateObject.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace DangerousD.GameCore.Network +{ + public class StateObject + { + public Socket workSocket; + public int bufferSize; + public byte[] buffer; + public StringBuilder sb = new StringBuilder(); + public int UploadedBytesCount; + + public StateObject(Socket socket, byte[] buffer) + { + workSocket = socket; + this.buffer = buffer; + bufferSize = buffer.Length; + UploadedBytesCount = 0; + } + } +}