Here's a standalone C# 4.0 app that demonstrates how to setup a TCP/IP sockets based client and server in .NET. It uses a command line option to determine whether to run the client or server. There's no external files or libraries needed, just the standard ones you get with a C# 4.0 console project. I've tested it with Visual Studio 2010 in Windows, and it will also work unchanged with Mono.
To run the server, from the command prompt...
SocketsTest -server
To run the client, from another command prompt ...
SocketsTest -client
Below is the source code ...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; ////// Standalone TCP/IP sockets example using C#.NET 4.0 /// ////// Compile as a C#.NET console mode application /// /// Command line usage: /// SocketsTest -client => run the client /// SocketsTest -server => run the server /// class SocketsTest { static TcpListener listener; // Sample high score table data static Dictionary<string, int> highScoreTable = new Dictionary<string, int>() { { "john", 1001 }, { "ann", 1350 }, { "bob", 1200 }, { "roxy", 1199 } }; static int Port = 4321; static IPAddress IP_ADDRESS = new IPAddress(new byte[] { 127, 0, 0, 1 }); static string HOSTNAME = "127.0.0.1"; static int MAX_CLIENTS = 5; public static void Main(string[] args) { if (args.Contains("-server")) { ServerMain(); } else if (args.Contains("-client")) { ClientMain(); } else { Console.WriteLine("Usage: SocketsTest -client => run the client"); Console.WriteLine(" SocketsTest -server => run the server"); } } ////// Server receives player name requests from the client and responds with the score. /// private static void ServerMain() { listener = new TcpListener(IP_ADDRESS, Port); listener.Start(); Console.WriteLine("Server running, listening to port " + Port + " at " + IP_ADDRESS); Console.WriteLine("Hit Ctrl-C to exit"); var tasks = new List(); for (int i = 0; i < MAX_CLIENTS; i++) { Task task = new Task(Service, TaskCreationOptions.LongRunning); task.Start(); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); listener.Stop(); } private static void Service() { while (true) { Socket socket = listener.AcceptSocket(); Console.WriteLine("Connected: {0}", socket.RemoteEndPoint); try { // Open the stream Stream stream = new NetworkStream(socket); StreamReader sr = new StreamReader(stream); StreamWriter sw = new StreamWriter(stream); sw.AutoFlush = true; sw.WriteLine("{0} stats available", highScoreTable.Count); while (true) { // Read name from client string name = sr.ReadLine(); if (name == "" || name == null) break; // Write score to client if (highScoreTable.ContainsKey(name)) sw.WriteLine(highScoreTable[name]); else sw.WriteLine("Player '" + name + "' was not found."); } stream.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("Disconnected: {0}", socket.RemoteEndPoint); socket.Close(); } } /// /// Client requests a player name's score from the server. /// private static void ClientMain() { TcpClient client = new TcpClient(HOSTNAME, Port); try { // Open the stream Stream stream = client.GetStream(); StreamReader sr = new StreamReader(stream); StreamWriter sw = new StreamWriter(stream); sw.AutoFlush = true; // Read and output the first line from the service, which // contains the number of players listed in the table. Console.WriteLine(sr.ReadLine()); while (true) { // Input player name Console.Write("Enter player name: "); string name = Console.ReadLine(); // Write name to server sw.WriteLine(name); if (name == "") break; // Read score from server Console.WriteLine(sr.ReadLine()); } stream.Close(); } finally { // Close the connection client.Close(); } } }
Follow @dodgy_coder
Subscribe to posts via RSS