C#SendData发送随机时间

时间:2016-04-05 22:50:12

标签: c# sockets

我正在尝试创建一个程序,其中服务器与客户端通信并向他们提供有关如何执行操作的命令。但是当我连接多个客户端时,它会多次随机地向客户端发送命令。我目前的代码:

    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。提前谢谢!

1 个答案:

答案 0 :(得分: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;
            }
        }

这解决了它。