Если вы хотите написать сервер, хорошим вариантом будет наличие [server] .exe и [client] .exe. [Server] .exe, конечно, будет принимать и обрабатывать все входящие соединения, поддерживать клиентские сокеты и выполнять любые необходимые действия. Ниже приведен очень базовый пример написания сервера для приема нескольких клиентских сокетов и сохранения их в объекте List. Это, однако, не многопоточное, поэтому код блокирует.
[сервер] .exe
//-----------------------------------------------------------------------------
// <copyright file="Program.cs" company="DCOM Productions">
// Copyright (c) DCOM Productions. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------------
namespace MultiSocketServerExample {
using System;
using System.Net.Sockets;
using System.Net;
using System.Collections.Generic;
class Program {
static List<Socket> m_ConnectedClients = new List<Socket>();
static void Main(string[] args) {
Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
host.Bind(new IPEndPoint(IPAddress.Any, 9999));
host.Listen(1);
while (true) {
m_ConnectedClients.Add(host.Accept());
Console.WriteLine("A client connected.");
}
}
}
}
Затем поработайте с вашими клиентами: (опять же очень базовый пример)
m_ConnectedClients[0].Send(Encoding.ASCII.GetBytes("hello!");
Сетевое программирование с классом Socket, на мой взгляд, намного проще, чем использование TcpListener и TcpClient. Причина, по которой я это говорю, заключается в том, что это уже действительно хорошая и простая в использовании реализация, и использование TcpListener и TcpClient, где они создают дополнительную абстракцию, уменьшает вашу способность понимать, что происходит (на мой взгляд).