SnakeGame/SnakeGame/Network.Client.cs
2017-01-07 23:53:36 +01:00

87 lines
3.4 KiB
C#

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SnakeGame
{
partial class Network
{
private static void ClientListenerThreadRun()
{
//TODO: Synchronised point placing on respawn
try
{
//Connect to the server
TcpClient client = new TcpClient(AddressFamily.InterNetworkV6);
client.Connect(ConnectedMatch.OwnerIP, Port);
var ns = client.GetStream().ToSafeNetStream();
Thread t = Thread.CurrentThread;
ns.ErrorStopClient = client;
ns.ErrorStopThread = t;
var sw = new BinaryWriter(ns);
sw.Write(52);
JObject writedata = new JObject();
writedata["PlayerName"] = Game.Player.Name;
writedata["Color"] = Game.Player.Color.ToArgb();
sw.Write(writedata.ToString());
var sr = new BinaryReader(ns);
JObject readdata = JObject.Parse(sr.ReadString());
Game.GameSize = new Point((int)readdata["GameSize"]["X"], (int)readdata["GameSize"]["Y"]);
Game.GameField = new SqCoord[Game.GameSize.X, Game.GameSize.Y];
Game.Length = (int)readdata["Length"];
ConnectedMatch.OwnerName = (string)readdata["OwnerName"]; //2015.08.29.
for (int i = 0; i < Game.GameSize.X; i++)
{
for (int j = 0; j < Game.GameSize.Y; j++)
{
Game.GameField[i, j].PlayerName = (string)readdata["GameField"][i + ""][j + ""]["PlayerName"];
Game.GameField[i, j].Tick = (int)readdata["GameField"][i + ""][j + ""]["Tick"];
Game.GameField[i, j].Type = (SquareType)Enum.Parse(typeof(SquareType), (string)readdata["GameField"][i + ""][j + ""]["Type"]);
}
}
ConnectedMatch.Players.Clear();
foreach (JProperty item in readdata["Players"])
{
ConnectedMatch.Players.Add(new Player(item.Name, color: Color.FromArgb((int)item.Value["Color"]), x: (int)item.Value["Position"]["X"], y: (int)item.Value["Position"]["Y"]));
if (item.Name == ConnectedMatch.OwnerName)
ConnectedMatch.Players.Last().Client = client;
}
Game.Paused = false;
SendUpdate = true;
Game.Reset(false);
while (true)
{
string playername = sr.ReadString();
try
{
Player player = ConnectedMatch.Players.SingleOrDefault(entry => entry.Name == playername);
ReceiveAndProcessData(player, sr);
}
catch (Exception e)
{
Program.HandleException(e);
}
}
}
catch(ObjectDisposedException)
{
return;
}
catch (Exception e)
{
Program.HandleException(e);
}
}
}
}