Есть ли лучший способ сделать приложение сервер-клиент? - PullRequest
0 голосов
/ 20 января 2012

Я делаю клиент сервера приложений, используя tcp сокеты в c # ..

Приложение имеет несколько задач, таких как передача файлов .. файловый менеджер .. чат .. (голосовой чат позже)

Поэтому я решил создать сокет для приема команд в виде строки и еще один сокет для передачи файлов ..
Это хороший способ для программирования клиент-серверного приложения или я должен попробовать другой способ? потому что пользователь мог отправить сообщение при получении / отправке файла

и как я могу сказать (сервер передачи файлов) принять только того же клиента, который уже подключился к основному серверу

ex: сервер прослушивает порт 8000 и принимает клиентов .. и передача файлов на порт 8111

public StartSever()
{
    sr = new StreamReader(networkStream);
while(connected)
{
        string[] command = sr.ReadLine().split(',');
        switch (Command[0])
        {
            case "RecFile":
                StartFileTransferServer();  // creating new socket tcp listens on port 8111
                Receiving();
                break;
            case "SendFile":
                StartFileTransferServer();  // creating new socket tcp listens on port 8111
                Sending();
                break;
            case "Chat":
                chat(Command[1]);
                break;
            default:
                break;
        }

}

Ответы [ 3 ]

1 голос
/ 20 января 2012

Вы можете использовать некую коммуникационную среду или библиотеку, которая абстрагирует детали сокетов TCP / IP и позволит вам отправлять объекты, сообщения и файлы между клиентом и сервером и не беспокоиться обо всех деталях.

Некоторые вещи, которые вы можете использовать вместо:

Это всего лишь несколько примеров, о которых я подумал: у меня есть тонны таких каркасов, которые работают на разных уровнях абстракции и предлагают более тяжелый или легкий вес.реализации.Я уверен, что вы могли бы найти тот, который отвечает вашим основным потребностям.

1 голос
/ 20 января 2012

Приложение имеет несколько задач, таких как передача файлов .. файловый менеджер .. чат .. (голосовой чат позже)

Если вы не получили больше, чем использование строки, разделенной двоеточиямиПротокол и switch заявления Я рекомендую вам остановиться прямо здесь.

Я настоятельно рекомендую вместо этого использовать WCF с netTcpBinding и двухсторонним связыванием: http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,b891610a-6b78-4b54-b9a6-4ec81c82b7c0.aspx

Вы не добьетесь успеха с VoiceChat самостоятельно.Купите для этого компонент.

0 голосов
/ 20 января 2012

Когда вы звоните Принять, вы получаете сокет для нового пользователя. После этого вы можете создать NetworkStream. Write и Read являются методами блокировки. Вы можете попробовать использовать асинхронные методы: BeginRead и BeginWrite. Также создание новой темы для пользователя не очень хорошо, если у вас будет тысячи пользователей. Я предлагаю такое решение: один поток принимает соединения и отправляет работу в пул потоков.

Примерно так (обратите внимание, это только черновик):

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ConsoleServer
{
class Program
{
    private static void Worker(Object sockObj)
    {
        var mySocket = (Socket) sockObj;
        using(var netStream = new NetworkStream(mySocket))
        {
            //Handle work;
        }            
    }

    static void Main(string[] args)
    {
        int port = 80;
        // create the socket
        Socket listenSocket = new Socket(AddressFamily.InterNetwork,
                                         SocketType.Stream,
                                         ProtocolType.Tcp);

        // bind the listening socket to the port
        IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
        IPEndPoint ep = new IPEndPoint(hostIP, port);
        listenSocket.Bind(ep);

        // start listening
        listenSocket.Listen(125);

        while (true)
        {
            Socket mySocket = listenSocket.Accept();
            ThreadPool.QueueUserWorkItem(new WaitCallback(Worker), mySocket);
        }
    }
}

}

...