TCP is one of the core protocols of the Internet and is a bi-directional, client/server protocol. In .NET you can use the
TcpListener Class for the server component, which provides simple methods that listen for and accept incoming connection requests from clients. You can use the
TcpClient Class for the client component, which provides client connections to TCP server components; it provides simple methods for connecting, sending, and receiving stream-based data over the network.
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