This is a very simplest client server model which is only to demonstrate the client server working model. And a simple program to learn threads in C#.
Client connects to the server and then server delivers a unique number to each client by simply incrementing a static variable. The increment is locked for thread safety.
Code for the server.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.IO; using System.Threading; namespace ConsoleServer { class Program { static TcpListener server; static int count = 0; static readonly object o = new object(); static void Main(string[] args) { IPHostEntry host = Dns.GetHostEntry("localhost"); IPAddress ip = new IPAddress(host.AddressList.First().GetAddressBytes()); server = new TcpListener(ip, 2000); server.Start(); bool exit = false; Console.WriteLine("Server started on port 2000"); while (!exit) { // here pending requests are in a queue. if (server.Pending()) { new Thread(Program.ServerService).Start(); } } Console.ReadKey(); server.Stop(); } public static void ServerService() { Socket socket = server.AcceptSocket(); Console.WriteLine("Connected " + socket.RemoteEndPoint); Stream stream = new NetworkStream(socket); StreamWriter writer = new StreamWriter(stream); StreamReader reader = new StreamReader(stream); writer.AutoFlush = true; writer.Write("Initial Number {0}",GetNumber()); bool client = false; new Thread(() => { while (!client) { string s = ""; s = reader.ReadLine(); if (s == "req") { writer.Write(GetNumber()); writer.Flush(); } } }).Start(); } private static int GetNumber() { // here sleep time gets activated after one client leaves the lock block. // so if a first client gets short long sleep time and second one gets short, still the second one has to wait till the first one finishes. Random r = new Random(); int time = r.Next(200, 2000); Console.WriteLine("Sleeping time : {0}", time); lock(o) { Thread.Sleep(time); return ++count; } } } }
Code for the client
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO; using System.Threading; namespace ConsoleClient { class Program { static void Main(string[] args) { TcpClient client = new TcpClient("localhost", 2000); Stream stream = client.GetStream(); StreamReader reader = new StreamReader(stream); Console.WriteLine(reader.ReadLine()); stream.Flush(); new Thread(() => { Console.WriteLine("New Request {0} ", reader.ReadLine()); Console.WriteLine("Waiting for exit"); Console.ReadKey(); }).Start(); while (true) { string req = Console.ReadLine(); if (req == "new") { StreamWriter writer = new StreamWriter(stream); writer.Write(req); writer.Flush(); } } client.Close(); } } }
I’ll probably be back again to read through more, thanks for the info!
Very simple and helpful, I’d like to know how I can send and receive a multiline messagem through this protocol. The method .Flush() do this for me? Thanks!
this is a simple implementation, ReadToEnd method would help you in achieving multi line messages. Flush() flushed the stream buffer forcefully.
ok, I’ve tried this, but thank you anyway