2016-04-05 10 views
0

サーバがクライアントと通信し、何をすべきかに関するコマンドを与えるプログラムを作成しようとしています。しかし、複数のクライアントを接続すると、クライアントにコマンドを複数回ランダムに送信します。現在のコード:C#SendDataはランダムな時間を送信します

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
namespace Server 
{ 
    class Program 
    { 
     private static byte[] _buffer = new byte[1024]; 
     private static List<Socket> _clientSockets = new List<Socket>(); 
     private static int SERVERPORT = 5555; 
     private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     private static String command; 

     static void Main(string[] args) 
     { 
      Thread serverThread = new Thread(new ThreadStart(SetupServer)); 
      Thread readThread = new Thread(new ThreadStart(checkInput)); 
      serverThread.Start(); 
      readThread.Start(); 

     } 


     private static void SetupServer() 
     { 
      Console.WriteLine("Setting up server..."); 
      _serverSocket.Bind(new IPEndPoint(IPAddress.Any, SERVERPORT)); 
      _serverSocket.Listen(100); 
      _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 
     } 

     private static void AcceptCallback(IAsyncResult AR) 
     { 
      while (true) 
      { 
       if (_serverSocket != null) 
       { 
        try 
        { 
         Socket socket = _serverSocket.EndAccept(AR); 
         _clientSockets.Add(socket); 
         Console.WriteLine("Client conntected"); 
        } 
        catch 
        { 

        } 
       } 
        if (command != null) 
        { 
         byte[] data = Encoding.ASCII.GetBytes(command); 
         foreach (Socket s in _clientSockets) 
         { 
          s.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), s); 
         } 
        } 
        command = null; 

       _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 

      } 
     } 

     private static void ReceiveCallback(IAsyncResult AR) 
     { 
      Socket socket = (Socket)AR.AsyncState; 
      //int received = socket.EndReceive(AR); 
      //byte[] dataBuf = new byte[received]; 
      //Array.Copy(_buffer, dataBuf, received); 
      //string text = Encoding.ASCII.GetString(dataBuf); 
      string response = string.Empty; 
      response = Console.ReadLine(); 



      byte[] data = Encoding.ASCII.GetBytes(response); 
      socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); 
      socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); 

     } 

     private static void SendCallback(IAsyncResult AR) 
     { 
      try { 

       Socket socket = (Socket)AR.AsyncState; 
       socket.EndSend(AR); 
      } 
      catch { 

      } 
     } 

     public static void checkInput() 
     { 
      while (true) 
      { 
       command = Console.ReadLine(); 
      } 
     } 


    } 
} 

例です。私はサーバーを起動し、次に3人のクライアントを起動します。これは出力です: Output

ランダムな時間を送信する理由は全くありません。また、なぜコンソール#2にダブル2があるのですか?前もって感謝します!

+0

そして、すべてのクライアントはtelnetで接続していますか? – Baronz

+0

なぜ、trueと条件なしに設定されているwhileループがありますか? –

+0

@JoshStevens私は接続をチェックするための無限ループが必要なので。私は別のスレッドでそれを作ったが、私はこの方法を選んだ。 –

答えて

0

これが問題を引き起こした:

if (command != null) 
        { 
         byte[] data = Encoding.ASCII.GetBytes(command); 
         foreach (Socket s in _clientSockets) 
         { 
          s.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), s); 
         } 
        } 
        command = null; 

私はreadThreadスレッドにコードのこの部分を追加しました。

public static void checkInput() 
     { 
      while (true) 
      { 
       command = Console.ReadLine(); 
       Console.WriteLine("Sending"); 
       byte[] data = Encoding.ASCII.GetBytes(command); 
       foreach (Socket s in _clientSockets) 
       { 
        s.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), s); 
       } 
       command = null; 
      } 
     } 

これを解決しました。

関連する問題