如何连续向客户端发送整数?我如何发送连接到客户端的客户端数量?

时间:2016-10-14 12:01:25

标签: c# asynchronous server client

我正在尝试为学校项目制作多人游戏curve_fever。现在,我有一个有效的客户端 - 服务器连接和一个工作聊天框。我无法弄清楚的是如何发送连接到所有客户端的客户端数量。通过这样做,我可以确保游戏等待适量的人。我也无法弄清楚如何连续地将数据从客户端发送到服务器并返回。所以我可以看到所有球员的所有坐标。

这是我的服务器:

public class Server
{
    public TcpListener Listener;
    private volatile bool Running; //wordt gebruikt door meerdere threads zonder lock te gebruiken (lock zorgt ervoor dat een thread niet doorgaat naar belangrijke code terwjil een andere thread nog bezig is om naar de locked code te gaan.
    private List<BinaryWriter> writers = new List<BinaryWriter>();
    public Server(int port)
    {
        Listener = new TcpListener(IPAddress.Any, port);
    }

    public void Start()
    {
        Listener.Start(10);
        Running = true;

        while (Running)
        {
            var connection = Listener.AcceptTcpClient();
            ProcessConnection(connection);//Het zal asynchroon werken, omdat we nog niet eerder een beroep hebben geschreven af te wachten
        }
    }


    public async Task ProcessConnection(TcpClient connection)
    { //Het zal worden uitgevoerd in een afzonderlijke thread
        var writer = new BinaryWriter(connection.GetStream());

        lock (writers)
        {
            writers.Add(writer);
        }

        using (var stream = new BinaryReader(connection.GetStream()))
        {
            //loop 
            while (Running && connection.Connected)
            {
                await Task.Factory.StartNew(() => {
                    var count = stream.ReadInt32();
                    var data = stream.ReadBytes(count);
                    ProcessCommand(connection, writer, data);
                });
            }
            connection.Close();
        }
        lock (writers)
        {
            writers.Remove(writer);
        }
    }


    private void ProcessCommand(TcpClient connection, BinaryWriter writer, byte[] data)
    {
        var info = connection.Client.RemoteEndPoint as IPEndPoint;
        var line = System.Text.Encoding.ASCII.GetString(data);
        var response = String.Format("{1}:{2}: {0}", line, info.Address.ToString(), info.Port);
        Console.WriteLine(response);
        lock (writers)
        {
            foreach (var w in writers)
            {
                if (w != null)
                {
                    try
                    {
                        w.Write((Int32)data.Length);
                        w.Write(data);
                        w.Flush();
                    }
                    catch
                    {

                    }
                }
            }
        }
    }


    public void Stop()
    {
        Running = false;
        Listener.Stop();
    }
    ~Server()
    {
        Running = false;
        Listener.Stop();
    }
}

Andt他是我的客户:

       public async Task Start(int port)
    {

        Connection.Connect("localhost", port);
        Console.WriteLine("Connected");
        Running = true;
        Writer = new BinaryWriter(Connection.GetStream());

        using (var stream = new BinaryReader(Connection.GetStream()))
        {
            //infinite loop
            while (Running && Connection.Connected)
            {
                await Task.Factory.StartNew(() => {
                    var count = stream.ReadInt32();
                    var data = stream.ReadBytes(count);
                    ProcessCommand(data);
                });
            }
            Stop();
        }
    }
    //send data voor chat
    public async Task Send(String line)
    {
        if (Writer == null)
            return;
        await Task.Factory.StartNew(() => {
            var data = System.Text.Encoding.ASCII.GetBytes(line);
            Writer.Write((Int32)data.Length);
            Writer.Write(data);
            Writer.Flush();
        });
    }
    //krijg het aantal spelers connected

    private void ProcessCommand(byte[] data)
    {
        var line = System.Text.Encoding.ASCII.GetString(data);
        Console.WriteLine(line);
        //stuur data van server naar method
        textboxChat(line);
    }

    public void Stop()
    {
        Running = false;
        Writer.Close();
        Writer = null;
        Connection.Close();

    }
    ~GamePlay()
    {
        Stop();
    }

1 个答案:

答案 0 :(得分:0)

第1点:连接客户的数量:

服务器端:

创建一个存储有关已连接客户端信息的词典。 我会个人使用客户端IP(或您拥有的任何其他标识)作为密钥,客户端数据作为值(最后连接的时间戳,客户端坐标等等)。

您必须在每个新连接上更新此词典,并且每次客户端断开/发送新数据,或者上次操作太旧时都会更新。

这样,当向客户端发送数据时,您可以将Dictionary.KeyValuePair的计数作为所有连接客户端的数量发送。

一旦您准备好管理所有这些数据,您现在需要向客户端和服务器发送数据。 为此,请确保您能够双向发送消息。

第二点:在客户端和服务器之间不断地来回发送数据。

客户端: *在主循环中:发送带有数据的消息。

  • 从服务器接收数据时://使用数据做任何你想做的事。

服务器端: *从客户端接收数据时:更新字典中的数据,然后将其发送回所有其他已知客户端。

我就是这样做的。 这是另一种解决方案:将数据作为对自己更新的答案发送回客户端 - &GT;当服务器从客户端接收数据时,他会回复所有客户端的所有数据。

相关问题