98 lines
2.5 KiB
C#
98 lines
2.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
|
using System.Threading.Tasks;
|
|
|
|
using static System.Console;
|
|
|
|
class DistributedProgramming
|
|
{
|
|
const int Port = 555;
|
|
|
|
async static Task RunClient()
|
|
{
|
|
WriteLine("Connecting");
|
|
var client = new TcpClient();
|
|
await client.ConnectAsync("localhost", Port);
|
|
|
|
using (var stream = client.GetStream())
|
|
{
|
|
WriteLine("Sending loot");
|
|
var data = Serialize(new SampleData());
|
|
await stream.WriteAsync(data, 0, data.Length);
|
|
|
|
WriteLine("Receiving thanks");
|
|
var buffer = new byte[80000];
|
|
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
|
|
var thanks = (string)Deserialize(buffer, bytesRead);
|
|
WriteLine(thanks);
|
|
}
|
|
|
|
client.Close();
|
|
}
|
|
|
|
async static Task RunServer()
|
|
{
|
|
WriteLine("Listening");
|
|
var listener = new TcpListener(IPAddress.Any, Port);
|
|
listener.Start();
|
|
var client = await listener.AcceptTcpClientAsync();
|
|
|
|
using (var stream = client.GetStream())
|
|
{
|
|
WriteLine("Receiving loot");
|
|
var buffer = new byte[80000];
|
|
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
|
|
var data = (SampleData)Deserialize(buffer, bytesRead);
|
|
WriteLine($"{data.Loot} at {data.Latitude}, {data.Longitude}");
|
|
|
|
WriteLine("Sending thanks");
|
|
var thanks = Serialize("Thanks!");
|
|
await stream.WriteAsync(thanks, 0, thanks.Length);
|
|
}
|
|
|
|
client.Close();
|
|
listener.Stop();
|
|
Write("Press a key");
|
|
ReadKey();
|
|
}
|
|
|
|
static byte[] Serialize(object data)
|
|
{
|
|
using (var mem = new MemoryStream())
|
|
{
|
|
new BinaryFormatter().Serialize(mem, data);
|
|
return mem.ToArray();
|
|
}
|
|
}
|
|
|
|
static object Deserialize(byte[] data, int length)
|
|
{
|
|
using (var mem = new MemoryStream(data, 0, length))
|
|
{
|
|
return new BinaryFormatter().Deserialize(mem);
|
|
}
|
|
}
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
if (args.Length == 0) return;
|
|
|
|
switch (args[0])
|
|
{
|
|
case "client": RunClient().Wait(); break;
|
|
case "server": RunServer().Wait(); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
class SampleData
|
|
{
|
|
public decimal Latitude = 44.33190m;
|
|
public decimal Longitude = 114.84129m;
|
|
public string Loot = "140 tonnes of jade";
|
|
}
|