2014-11-12 3 views
1

Я пытаюсь получить многопоточный клиент/сервер UDP, но я столкнулся с проблемами на стороне сервера. Когда клиент пытается зарегистрироваться, создается поток, и все взаимодействия для этого клиента обрабатываются в этом потоке, но по какой-то причине он только входит в поток, а затем выходит сразу. Может ли кто-нибудь помочь выяснить, почему это происходит? -Спасибо заранее ..Многопоточный клиент/сервер UDP C#

namespace AuctionServer 
{ 
    class Program 
    { 
    public static Hashtable clientsList = new Hashtable(); 

    static void Main(string[] args) 
    { 
     //IPAddress ipAd = IPAddress.Parse("255.255.255.255"); 
     UdpClient server = new UdpClient(8888); 
     IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); 
     string data = ""; 
     int listSize = 0; 
     Console.WriteLine("Auction Server Started ...."); 
     listSize = clientsList.Count; 

     while (true) 
     { 
      //Reads data 
      byte[] inStream = server.Receive(ref remoteEndPoint); 
      data = Encoding.ASCII.GetString(inStream); 
      //Console.WriteLine("REGISTER " + remoteEndPoint); 

      if (!data.Contains("DEREGISTER ")) 
      { 
       byte[] sendBytes = Encoding.ASCII.GetBytes(data + remoteEndPoint.ToString()); 
       server.Send(sendBytes, sendBytes.Length, remoteEndPoint); 
       handleClinet client = new handleClinet(); 
       Console.WriteLine(data); 
       clientsList.Add(data, server); 
       client.startClient(server, data, clientsList, remoteEndPoint); 
       data = ""; 
      } 
     } 
    } 

    //Broadcast method is used to send message to ALL clients 
    public static void broadcast(UdpClient dest, string msg, string uName, bool flag, IPEndPoint sendEP, Hashtable clientsList) 
    { 
     foreach (DictionaryEntry Item in clientsList) 
     { 
      Byte[] broadcastBytes = null; 

      if (flag == true) 
      { 
       broadcastBytes = Encoding.ASCII.GetBytes(msg); 
      } 
      else 
      { 
       broadcastBytes = Encoding.ASCII.GetBytes(msg); 
      } 
      dest.Send(broadcastBytes, broadcastBytes.Length, sendEP); 

     } 
    } 
}//end Main class 

}

namespace AuctionServer 
{ 
public class handleClinet 
{ 
    UdpClient clientSocket; 
    string clNo; 
    Hashtable clientsList; 
    IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0); 
    IPEndPoint myEP = new IPEndPoint(IPAddress.Any, 0); 

    public void startClient(UdpClient inClientSocket, string clineNo, Hashtable cList, IPEndPoint tempEP) 
    { 
     this.myEP = tempEP; 
     this.clientSocket = inClientSocket; 
     this.clNo = clineNo; 
     this.clientsList = cList; 
     Thread ctThread = new Thread(doChat); 
     ctThread.Start(); 
    } 

    private void doChat() 
    { 
     int requestCount = 0; 
     byte[] bytesFrom = new byte[10025]; 
     string dataFromClient = null; 
     string rCount = null; 
     requestCount = 0; 

     while ((true)) 
     { 
      try 
      { 
       //Thread.Sleep(1000); 
       if (requestCount == 0) 
       { 
        Console.WriteLine("Thread Created"); 
        requestCount++; 
       } 
       byte[] received = clientSocket.Receive(ref remoteIPEndPoint); 
       dataFromClient = Encoding.ASCII.GetString(received); 
       Console.WriteLine(dataFromClient); 

       if (dataFromClient.Contains("DEREGISTER")) 
        clientSocket.Send(received, received.Length, remoteIPEndPoint); 
        //Program.broadcast(clientSocket, "DREG-CONF", clNo, true, myEP, clientsList); 
       //else 
       // Program.broadcast(clientSocket, dataFromClient, clNo, true, myEP, clientsList); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       Console.ReadKey(); 
       break; 
      } 
     }//end while 
    }//end doChat 

}

+1

Вы получаете какие-либо исключения в 'Console.WriteLine (ex.ToString());'? –

+0

Я не получаю исключений, код застрял в цикле Program.cs while, а не постоянно в цикле while. @MarkSegal – philr

ответ

1

две петли работают на разных потоках. Таким образом, цикл в Main() выполняется одновременно с циклом в вашем классе handleClinet.

Если вы хотите переключиться на петлю и отладить его в handleClinet класса, а затем использовать Threads окно в отладчике (Debug меню Windows пункта меню, затем Threads ... или нажмите Ctrl - D, T), чтобы перейти к это нить. Затем вы можете увидеть стек вызовов и состояние этого потока.

Обратите внимание, что это может не работать в Express-версии Visual Studio. Я не пробовал самую последнюю версию, но прошлые версии не поддерживали окно Threads. (Вы все равно можете отлаживать определенный поток, установив там точку останова и hellip, просто вы не можете переключиться на поток вручную).

+0

У меня отладка, и я не могу понять проблему. Я хочу, чтобы, когда клиент отправил сервер команде «Регистрация», сервер создает поток для этого клиента и обрабатывает связь в этом потоке. Это возможно? @PeterDuniho – philr

+0

Я не вижу, что это касается вопроса о том, какие потоки работают. Но нет, если нить использует тот же сокет, который используется в каком-то другом потоке. Как я объяснил в ответ на ваш предыдущий вопрос, если у вас есть два разных потока, которые читаются из одного и того же сокета, у вас нет способа контролировать, какое сообщение считывается через какой поток. –

+0

Я просто отлаживался с помощью меню «Темы», и когда я поставил контрольные точки и проверял следующие утверждения с помощью F10, код, похоже, работает нормально. Но когда я удаляю точки останова и запускаю код, как правило, он не работает. Можете ли вы придумать причину этого? @PeterDuniho Спасибо за вашу помощь кстати – philr

Смежные вопросы