2014-09-22 60 views
0

我是新来的客户端服务器编程在C#中。 我目前在c#中使用线程为每个连接的客户端创建一个简单的队列应用程序。 有人可以帮我用我的代码?C#客户端服务器队列应用程序

这个代码的问题是,它只能从一个客户端读取,甚至有更多的客户端连接。

 using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Net; 
    using System.Net.Sockets; 
    using System.Text; 
    using System.Threading; 
    using System.Threading.Tasks; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using System.Windows.Navigation; 
    using System.Windows.Shapes; 

    namespace Server 
    { 
     /// <summary> 
     /// Interaction logic for MainWindow.xaml 
     /// </summary> 
     public partial class MainWindow : Window 
     { 
      static TcpListener tcpListener; 
      NetworkStream networkStream; 
      System.IO.StreamWriter streamWriter; 
      System.IO.StreamReader streamReader; 
      string[,] client = new string[999, 3]; 
      int connectedclient = 0; 
      int queuecount = 0; 
      int[] peopleque = new int[999]; 
      int quenumber = 0; 

      public void Listener() 
      { 
       Socket socketForClient = tcpListener.AcceptSocket(); 
       string clientip = ""; 
       if (socketForClient.Connected) 
       { 
        AddItem("Client:" + socketForClient.RemoteEndPoint + " now connected to server."); 
        client[connectedclient, 0] = socketForClient.RemoteEndPoint.ToString(); 
        client[connectedclient, 2] = "active"; 
        connectedclient++; 
        networkStream = new NetworkStream(socketForClient); 
        streamWriter = new System.IO.StreamWriter(networkStream); 
        streamReader = new System.IO.StreamReader(networkStream); 
        clientip = socketForClient.RemoteEndPoint.ToString(); 
        while (true) 
        { 
         string theString = streamReader.ReadLine(); 

         if (theString != null && theString != "" && theString != " ") 
         { 
          string Connection = socketForClient.RemoteEndPoint.ToString(); 
          AddItem("Message received by client (" + Connection + ") : " + theString); 
          if (theString[0] == 'r') 
          { 
           for (int i = 0; i < connectedclient; i++) 
           { 
            if (client[i, 0] == socketForClient.RemoteEndPoint.ToString()) 
            { 
             client[i, 1] = theString.Substring(1); 
             AddItem("Client " + socketForClient.RemoteEndPoint.ToString() + " is connected as kassa " + client[i, 1]); 
            } 
           } 
          } 
          if (theString[0] == 'q') 
          { 
           streamWriter.Write(theString); 
           streamWriter.Flush(); 
          } 

          switch (theString) 
          { 
           case "exit": 
            string connectedip = socketForClient.RemoteEndPoint.ToString(); 
            for (int i = 0; i < connectedclient; i++) 
            { 
             if (client[i, 0] == connectedip) 
             { 
              client[i, 0] = ""; 
              client[i, 1] = ""; 
              client[i, 2] = ""; 
              if (connectedclient - 1 != 0) 
              { 
               connectedclient--; 
               client[i, 0] = client[connectedclient, 0]; 
               client[i, 1] = client[connectedclient, 1]; 
               client[i, 2] = client[connectedclient, 2]; 
               client[connectedclient, 0] = ""; 
               client[connectedclient, 1] = ""; 
               client[connectedclient, 2] = ""; 
               break; 
              } 
              break; 
             } 
            } 
            socketForClient.Disconnect(true); 
            socketForClient.Close(); 

            break; 
           case "break": 
            connectedip = socketForClient.RemoteEndPoint.ToString(); 
            for (int i = 0; i < connectedclient; i++) 
            { 
             if (client[i, 0] == connectedip) 
             { 
              client[i, 2] = "inactive"; 
              AddItem("client " + socketForClient.RemoteEndPoint.ToString() + " is inactive"); 
              break; 
             } 
            } 
            break; 
           case "empty": 
            for (int i = 0; i < connectedclient; i++) 
            { 
             if (client[i, 0] == socketForClient.RemoteEndPoint.ToString()) 
             { 
              if (queuecount <= 0) 
              { 
               client[i, 2] = "empty"; 
               AddItem("Client " + socketForClient.RemoteEndPoint.ToString() + " is empty"); 
              } 
              else 
              { 
               streamWriter.WriteLine("q" + peopleque[0] + "t" + client[i, 1]); 
               peopleque[0] = 0; 
               for (int j = 0; j < quenumber - 1; j++) 
               { 
                peopleque[j] = peopleque[j + 1]; 
               } 
               peopleque[queuecount] = 0; 
               queuecount--; 
               streamWriter.Flush(); 
              } 
             } 
            } 
            break; 
           case "new": 
            quenumber++; 
            bool found = false; 
            for (int i = 0; i < queuecount; i++) 
            { 
             if (client[i, 2] == "empty") 
             { 
              streamWriter.Write("q" + quenumber + "t" + client[i, 1]); 
              streamWriter.Flush(); 
              found = true; 
              break; 
             } 
            } 
            if (found == false) 
            { 
             peopleque[queuecount] = quenumber; 
             queuecount++; 
            } 
            break; 
          } 
          if (theString == "exit") 
           break; 
         } 
        } 
        streamReader.Close(); 
        networkStream.Close(); 
        streamWriter.Close(); 

       } 
       AddItem("client " + clientip + " Has Disconnected"); 
       socketForClient.Close(); 

      } 

      public void StartListening(int NumberOfClient) 
      { 
       tcpListener.Start(); 
       for (int i = 0; i < NumberOfClient; i++) 
       { 
        Thread newThread = new Thread(new ThreadStart(Listener)); 
        newThread.Start(); 
       } 
      } 

      public MainWindow() 
      { 
       InitializeComponent(); 
      } 

      private void AddItem(string item) 
      { 
       Application.Current.Dispatcher.Invoke(new Action(() => 
       { 
        LogListener.Items.Add(item); 
        LogListener.SelectedIndex = LogListener.Items.Count - 1; 
        LogListener.ScrollIntoView(LogListener.Items[LogListener.Items.Count - 1]); 
       })); 
      } 

      private void StartBtn_Click(object sender, RoutedEventArgs e) 
      { 
       //tcpListener = new TcpListener(Convert.ToInt32(PortTxt.Text)); 
       IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First(); 
       tcpListener = new TcpListener(ip.MapToIPv4(), Convert.ToInt32(PortTxt.Text)); 
       tcpListener.Start(); 
       AddItem("************This is Server program************"); 
       AddItem("This Computer IP Is : " + ip.MapToIPv4().ToString()); 
       PortTxt.IsEnabled = false; 
       StartBtn.IsEnabled = false; 
       StartListening(200); 
      } 

      private void Button_Click(object sender, RoutedEventArgs e) 
      { 
       try 
       { 
        streamWriter.WriteLine("Fuck"); 
        streamWriter.Flush(); 
       } 
       catch 
       { 
        Console.WriteLine("Exception reading from Server"); 
       } 
      } 

      private void btnCheck_Click(object sender, RoutedEventArgs e) 
      { 
       for (int i = 0; i < connectedclient; i++) 
       { 
        AddItem(client[i, 0]); 
       } 
      } 
     } 

} 

回答

0

您当前在具有相同TCP连接的同一端口上启动一组Listener实例。这不会像你想象的那样工作(就像你注意到的那样)。诀窍是有一个开放的Socket并接受客户端。当客户端被接受时,你产生一个处理通信的新线程。基本方案是:

  1. 创建Socket
  2. 呼叫BeginAcceptSocket
  3. BeginAcceptSocket回调,催生一个客户端一个新的线程连接
  4. 呼叫BeginAcceptSocket再次侦听新客户
+0

感谢您的回答。这对基本的真正帮助:D – user3185757 2014-09-23 03:59:52