【问题标题】:How do I continuously send integers to the client? And how do i send the amount of clients connected to the client?如何连续向客户端发送整数?以及如何发送连接到客户端的客户端数量?
【发布时间】:2016-10-14 12:01:25
【问题描述】:

我正在尝试为学校项目制作多人 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();
    }
}

他是我的客户:

       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();
    }

【问题讨论】:

    标签: c# asynchronous server client


    【解决方案1】:

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

    服务器端:

    创建一个字典来存储有关已连接客户端的信息。 我个人会使用客户端 IP(或您拥有的任何其他标识)作为键,使用客户端数据作为值(上次连接的时间戳、客户端坐标等...)。

    您必须在每次新连接时更新此字典,每次客户端断开/发送新数据时,或者当最后一个操作太旧时。

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多