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

142 lines
5.6 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;
namespace SnakeGame
{
partial class Network
{
private static TcpListener Listener;
private static void ServerListenerThreadRun()
{
//MessageBox.Show("Listener thread started.");
Listener = new TcpListener(IPAddress.IPv6Any, Port);
Listener.Start();
while (true)
{
TcpClient client;
try
{
client = Listener.AcceptTcpClient();
}
catch (SocketException)
{
return;
}
Thread t = new Thread(new ParameterizedThreadStart(ThreadPerPlayer));
PlayerThreads.Add(t);
t.Start(client);
}
}
/// <summary>
/// Serverside
/// </summary>
/// <param name="c"></param>
private static void ThreadPerPlayer(object c)
{
TcpClient client = c as TcpClient;
SafeNetStream ns = client.GetStream().ToSafeNetStream(client, Thread.CurrentThread);
BinaryReader br = new BinaryReader(ns);
StopEventPerPlayer += delegate
{
client.Close(); //Then the thread should abort
};
int is52 = br.ReadInt32();
if (is52 != 52)
{
client.Close();
return;
}
//Read and write inital data
//string playername = br.ReadString();
try
{
JObject readdata = JObject.Parse(br.ReadString());
string playername = readdata["PlayerName"].ToString();
/*int initialcolor;
if (!int.TryParse(readdata["Color"].ToString(), out initialcolor))
{
client.Close();
return;
}*/
if (Network.ConnectedMatch.Players.SingleOrDefault(entry => entry.Name == playername) != null)
{
client.Close();
return;
}
Player joinedplayer = new Player(playername, color: Color.FromArgb((int)readdata["Color"])); //Login==Connect
joinedplayer.Client = client;
ConnectedMatch.Players.Add(joinedplayer);
BinaryWriter bwp = new BinaryWriter(ns);
var senddata = new JObject();
senddata["Length"] = Game.Length;
senddata["OwnerName"] = Game.Player.Name; //2015.08.29.
senddata["GameSize"] = new JObject();
senddata["GameSize"]["X"] = Game.GameSize.X;
senddata["GameSize"]["Y"] = Game.GameSize.Y;
senddata["GameField"] = new JObject();
for (int i = 0; i < Game.GameSize.X; i++)
{
senddata["GameField"][i + ""] = new JObject();
for (int j = 0; j < Game.GameSize.Y; j++)
{
senddata["GameField"][i + ""][j + ""] = new JObject();
senddata["GameField"][i + ""][j + ""]["PlayerName"] = Game.GameField[i, j].PlayerName;
senddata["GameField"][i + ""][j + ""]["Tick"] = Game.GameField[i, j].Tick;
senddata["GameField"][i + ""][j + ""]["Type"] = Game.GameField[i, j].Type.ToString();
}
}
senddata["Players"] = new JObject();
foreach (Player player in ConnectedMatch.Players)
{
if (player.Name == joinedplayer.Name)
continue;
senddata["Players"][player.Name] = new JObject();
senddata["Players"][player.Name]["Position"] = new JObject();
senddata["Players"][player.Name]["Position"]["X"] = player.Position.X;
senddata["Players"][player.Name]["Position"]["Y"] = player.Position.Y;
senddata["Players"][player.Name]["Color"] = player.Color.ToArgb();
}
bwp.Write(senddata.ToString());
Game.Paused = false;
SendUpdate = true;
while (true)
{
if (!ReceiveAndProcessData(joinedplayer, br))
break;
}
}
catch
{
}
}
private static IEnumerable<BinaryWriter> ForwardMessage(Player player, string playername, int updatetype)
{
if (ConnectedMatch.OwnerName == Game.Player.Name)
{
Player p;
//while (ConnectedMatch.Players.GetEnumerator().MoveNext())
var en = ConnectedMatch.Players.GetEnumerator();
while(en.MoveNext())
{
p = ConnectedMatch.Players.GetEnumerator().Current;
if (p == null || p.Name == player.Name || p.Name == Game.Player.Name)
continue;
var bw = new BinaryWriter(p.Client.GetStream().ToSafeNetStream(p.Client, Thread.CurrentThread));
bw.Write(playername);
bw.Write(updatetype);
yield return bw;
}
}
yield break;
}
}
}