Distributed programming: Difference between revisions
Content deleted Content added
provided correct C# example |
|||
Line 182: | Line 182: | ||
=={{header|C sharp|C#}}== |
=={{header|C sharp|C#}}== |
||
Start the program with "server" parameter to start the server, and "client" to start the client. The client will send data to the server and receive a response. The server will wait for data, display the data received, and send a response. |
|||
{{incorrect|C sharp|The protocol used is not sufficiently general-purpose.}} |
|||
The example server can handle one client at any one time. It will read what the client writes, and respond with "Hello World!". The client will write "Hello World!" and read the response from the server. |
|||
===Server=== |
|||
<lang csharp> |
<lang csharp> |
||
using System; |
|||
using System.IO; |
|||
using System.Net; |
|||
using System.Net.Sockets; |
using System.Net.Sockets; |
||
using System.Runtime.Serialization.Formatters.Binary; |
|||
using System.Threading.Tasks; |
|||
using static System.Console; |
|||
class Program |
|||
class DistributedProgramming |
|||
{ |
{ |
||
const int Port = 555; |
|||
static void Main(string[] args) |
|||
{ |
|||
TcpListener server = new TcpListener(8000); |
|||
server.Start(); |
|||
async static Task RunClient() |
|||
Console.WriteLine("Listening, port 8000"); |
|||
{ |
|||
WriteLine("Connecting"); |
|||
var client = new TcpClient(); |
|||
await client.ConnectAsync("localhost", Port); |
|||
using (var stream = client.GetStream()) |
|||
TcpClient client; |
|||
{ |
|||
do |
|||
WriteLine("Sending loot"); |
|||
{ |
|||
var data = Serialize(new SampleData()); |
|||
// Accept client |
|||
await stream.WriteAsync(data, 0, data.Length); |
|||
client = server.AcceptTcpClient(); |
|||
Console.WriteLine("Recieved client: " + client.Client.AddressFamily.ToString()); |
|||
WriteLine("Receiving thanks"); |
|||
// Recieve |
|||
var buffer = new byte[80000]; |
|||
string tRecieve = ""; |
|||
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); |
|||
char t; |
|||
var thanks = (string)Deserialize(buffer, bytesRead); |
|||
do |
|||
WriteLine(thanks); |
|||
{ |
|||
} |
|||
if (client.Available > 0) |
|||
{ |
|||
t = (char)client.GetStream().ReadByte(); |
|||
client.Close(); |
|||
if (t == 0) |
|||
} |
|||
break; |
|||
async static Task RunServer() |
|||
tRecieve += t; |
|||
{ |
|||
} |
|||
WriteLine("Listening"); |
|||
} while (true); |
|||
var listener = new TcpListener(IPAddress.Any, Port); |
|||
listener.Start(); |
|||
var client = await listener.AcceptTcpClientAsync(); |
|||
using (var stream = client.GetStream()) |
|||
Console.WriteLine("Recieved: " + tRecieve); |
|||
{ |
|||
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"); |
|||
// Send |
|||
var thanks = Serialize("Thanks!"); |
|||
byte[] tSend = Encoding.ASCII.GetBytes("Hello World!"); |
|||
await stream.WriteAsync(thanks, 0, thanks.Length); |
|||
} |
|||
client.GetStream().WriteByte(0); |
|||
client.Close(); |
|||
Console.WriteLine("Sent: " + Encoding.ASCII.GetString(tSend)); |
|||
listener.Stop(); |
|||
Write("Press a key"); |
|||
ReadKey(); |
|||
} |
|||
static byte[] Serialize(object data) |
|||
// Close |
|||
{ |
|||
client.Close(); |
|||
using (var mem = new MemoryStream()) |
|||
} while (true); |
|||
{ |
|||
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; |
|||
} |
|||
} |
|||
} |
} |
||
</lang> |
|||
[Serializable] |
|||
===Client=== |
|||
class SampleData |
|||
<lang csharp> |
|||
using System.Net.Sockets; |
|||
class Program |
|||
{ |
{ |
||
public decimal Latitude = 44.33190m; |
|||
static void Main(string[] args) |
|||
public decimal Longitude = 114.84129m; |
|||
{ |
|||
public string Loot = "140 tonnes of jade"; |
|||
TcpClient client; |
|||
// Connect |
|||
do |
|||
{ |
|||
client = new TcpClient(); |
|||
client.Connect(new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8000)); |
|||
Console.WriteLine("Connected"); |
|||
// Send |
|||
byte[] tSend = Encoding.ASCII.GetBytes("Hello World!"); |
|||
client.GetStream().Write(tSend, 0, tSend.Length); |
|||
client.GetStream().WriteByte(0); |
|||
Console.WriteLine("Sent: " + Encoding.ASCII.GetString(tSend)); |
|||
// Read |
|||
string tRecieve = ""; |
|||
char t; |
|||
do |
|||
{ |
|||
if (client.Available > 0) |
|||
{ |
|||
t = (char)client.GetStream().ReadByte(); |
|||
if (t == 0) |
|||
break; |
|||
tRecieve += t; |
|||
} |
|||
} while (true); |
|||
Console.WriteLine("Recieved: " + tRecieve); |
|||
client.Close(); |
|||
Console.Read(); |
|||
} while (true); |
|||
} |
|||
} |
} |
||
</lang> |
</lang> |