C # проблема с мульти-клиентским серверным приложением - PullRequest
2 голосов
/ 03 января 2011

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

Но если есть другое соединение с клиентом (я снова запускаю клиентское приложение, что означает, что на моем компьютере запущено 2 клиентских приложения и 1 серверное приложение), мой сервер начинает портиться: сервер не получает загрузку файла от клиент, клиент не может загрузить с сервера.

В коде сервера я уже использовал многопоточность для каждого клиентского соединения, поэтому не могу понять проблему. Вот мой код сервера:

    private void ServerForm_Load(object sender, System.EventArgs e)
            {

                //...
                Thread th = new Thread(new ThreadStart(ListenForPeers));
                th.Start();
            }

    public void ListenForPeers()
            {
                    serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    serversocket.Blocking = true;
                    IPHostEntry IPHost = Dns.GetHostEntry(server);
                    string[] aliases = IPHost.Aliases;
                    IPAddress[] addr = IPHost.AddressList;
                    IPEndPoint ipepServer = new IPEndPoint(addr[0], 8090);
                    serversocket.Bind(ipepServer);
                    serversocket.Listen(-1);
                    while (true)
                    {
                        clientsock = serversocket.Accept();
                        if (clientsock.Connected)
                        {
                            total_clients_connected++;
                            AppendText("Client connected...");
                            Thread tc = new Thread(new ThreadStart(listenclient));
                            tc.Start();
                        }
             }


    void listenclient()
        {
             // start communication
        }

Что-то не так с моим кодом сервера, из-за которого он не может стать системой с несколькими клиентами? Помощь очень ценится. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 04 января 2011

Похоже, вы определили ваш clientSocket как глобальную переменную, которая будет использоваться всеми серверными потоками, вместо этого вы хотите, чтобы он был локальной ссылкой для каждого потока.Вы можете сделать это с помощью ParameterizedThreadStart:

public void listenForPeers()
{
  //Setup the server socket

  while(true){
    Socket newClient = serverSock.Accept();
    if(newClient.Connected){
      Thread tc = new Thread(new ParameterizedThreadStart(listenclient));
      tc.start(newClient);
    }
  }
}

void listenclient(object clientSockObj)
{
  Socket clientSock = (Socket)clientSockObj;

  //communication to client via clientSock.
}
1 голос
/ 04 января 2011

Во-первых, вы устанавливаете свойство блокировки вашего сокета в true. Это будет блокировать любые запросы, пока предыдущие не закончат ...

Смотрите здесь: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.blocking(VS.80).aspx

Если вы находитесь в режиме блокировки, и вы сделать вызов метода, который не заполнить немедленно, ваше заявление будет блокировать выполнение до запрошенная операция завершена. если ты хотите, чтобы исполнение продолжалось, хотя запрошенная операция не завершите, измените свойство блокировки ложно. Блокирующее свойство не имеет влияние на асинхронные методы. если ты отправляю и получаю данные асинхронно и хотите заблокировать выполнение, используйте ManualResetEvent класс.

Возможно, вы захотите пересмотреть решение о том, чтобы сделать это таким образом, и вместо этого использовать WCF или, возможно, веб-сервис для загрузки файлов ... это будет намного проще, и IIS будет обрабатывать потоки для вас. Довольно просто написать веб-сервис для загрузки файла ...

http://www.c -sharpcorner.com / UploadFile / scottlysle / UploadwithCSharpWS05032007121259PM / UploadwithCSharpWS.aspx

0 голосов
/ 08 марта 2013

попробуйте

const int noOfClients = 5;

for(int i=0;i<noOfClients;i++)
{
  Thread th = new Thread(new ThreadStart(ListenForPeers));
  th.Start();
}
...