クライアント/サーバーアプリケーションを正しく構築する方法は?

クックグリーン

クライアント/サーバーベースのゲームがどのように機能するかを学ぶためにクライアント/サーバーアプリケーションを構築していますが、アプリケーションがうまく機能しないようです。ここに私の質問があります。

  1. クライアントアプリケーションを閉じると、このアプリが「PlayerXXXleaves」を書き込めないのはなぜですか
  2. サーバーからデータを正しく受信する方法は?(サーバーから位置情報を受け取り、クライアントでレンダリングしたい)

ここに完全なコードがあります:

サーバ:

public class ServerApp
{
    public class Point
    {
        public int x;
        public int y;
    }

    TcpListener listener;
    List<Player> players;

    string[,] data = new string[20, 40];

    public ServerApp()
    {
        players = new List<Player>();
    }

    void PlayerJoin(TcpClient client)
    {
        lock (data)
        {
            if (data[0, 0] == "*")
            {
                data[0, 0] = "O";
                Player player = new Player();
                player.Entity = "O";
                player.Location = new Vector2(0,0);
                player.Client = client;
                players.Add(player);
            }
            else if (data[0, 39] == "*")
            {
                data[0, 40] = "P";
                Player player = new Player();
                player.Entity = "P";
                player.Location = new Vector2(0, 0);
                player.Client = client;
                players.Add(player);
            }
            else if (data[19, 0] == "*")
            {
                data[20, 0] = "I";
                Player player = new Player();
                player.Entity = "I";
                player.Location = new Vector2(0, 0);
                player.Client = client;
                players.Add(player);
            }
            else if (data[19, 39] == "*")
            {
                data[20, 40] = "U";
                Player player = new Player();
                player.Entity = "U";
                player.Location = new Vector2(0, 0);
                player.Client = client;
                players.Add(player);
            }
        }
    }

    void InitData(ref string[,] data)
    {
        for (int i = 0; i < 20; i++)
        {
            for (int j = 0; j < 40; j++)
            {
                if (i != 0 && i != 19)
                {
                    if (j != 0 && j != 39)
                    {
                        data[i, j] = " ";
                    }
                    else
                    {
                        data[i, j] = "*";
                    }
                }
                else
                {
                    data[i, j] = "*";
                }
            }
        }
    }

    void InitServer()
    {
        listener = new TcpListener(new IPAddress(new byte[] { 127, 0, 0, 1 }), 6666);
        listener.Start();
    }

    void SyncDataToAllClient()
    {
        foreach (var player in players)
        {
            StreamWriter sw = new StreamWriter(player.Client.GetStream());
            int[] pos = new int[2];
            pos[0] = player.Location.x;
            pos[1] = player.Location.y;
            sw.Write(pos[0]);
            sw.Write(pos[1]);
            sw.Close();
        }
    }

    public void Run()
    {
        InitServer();
        InitData(ref data);

        while (true)
        {
            if(listener.pending())
            {
            var myclient = listener.AcceptTcpClient();
            if (myclient != null)
            {
                Console.WriteLine(string.Format("Client from {0} connected!", ((IPEndPoint)myclient.Client.RemoteEndPoint).Address));
                PlayerJoin(myclient);

                Thread.Sleep(1000 * 5);

                StreamWriter sw = new StreamWriter(myclient.GetStream());
                sw.Write(data);
            }
            CheckClient();
            SyncDataToAllClient();
            }
        }
    }

    private void CheckClient()
    {
        foreach (var p in players)
        {
            if (!p.Client.Connected)
            {
                Console.WriteLine("Player {0} leave!", ((IPEndPoint)p.Client.Client.RemoteEndPoint).Address);
                players.Remove(p);
                data[p.Location.y, p.Location.x] = "*";
            }
        }
    }
}

クライアント:

public class ClientApp
{
    TcpClient client;

    string[,] data = new string[20, 40];
    bool quit;
    public void Run()
    {
        EstablishConntionToServer();
        InitData(ref data);
        while (!quit)
        {
            SyncDataFromServer(ref data);
            PrintData(data);
        }
    }

    void EstablishConntionToServer()
    {
        client = new TcpClient();
        client.Connect(new IPAddress(new byte[] { 127, 0, 0, 1 }), 6666);
    }

    void SyncDataFromServer(ref string[,] data)
    {
        Stream s = client.GetStream();
        char[] buffer=new char[1];
        StreamReader sr = new StreamReader(s);
        sr.Read(buffer,0,1);
    }

    void InitData(ref string[,] data)
    {
        for (int i = 0; i < 20; i++)
        {
            for (int j = 0; j < 40; j++)
            {
                //data[i, j] = "*";
                if (i != 0 && i != 19)
                {
                    if (j != 0 && j != 39)
                    {
                        data[i, j] = " ";
                    }
                    else
                    {
                        data[i, j] = "*";
                    }
                }
                else
                {
                    data[i, j] = "*";
                }
            }
        }
    }

    void PrintData(string[,] data)
    {
        Console.Clear();
        for (int i = 0; i < 20; i++)
        {
            for (int j = 0; j < 40; j++)
            {
                Console.Write(data[i, j]);
            }
            Console.Write(Environment.NewLine);
        }

        System.Threading.Thread.Sleep(500);
    }
}
ショーンミッチェル

ソリューション:

サーバーでクライアントの動きを送信するには、速度にUDPを使用する必要があります。これは、ゲームで必要とされるデータを頻繁に送信するための最も効率的な方法です。

他の質問については、クライアントが残っていることを知らない可能性があります。接続が適切に閉じられなかった可能性があるため、接続が閉じられたと認識されるにはタイムアウトする必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

共有ソースを使用してクライアントサーバーアプリケーションを構築するためのMakefile

分類Dev

共有ソースを使用してクライアントサーバーアプリケーションを構築するためのMakefile

分類Dev

ExpressJSアプリケーションを構築する方法は?

分類Dev

JAVAでサーバークライアントアプリケーションを実行する方法

分類Dev

Java Swingアプリケーションをクライアントサーバーアプリケーションにする方法

分類Dev

フェニックスで特定の応答のクライアントサブスクリプションを使用してWebソケットサーバーを構築するにはどうすればよいですか?

分類Dev

クライアントにSQLサーバーデータベースを使用してアプリケーションをデプロイする方法

分類Dev

クラウドサーバーにlaravelアプリケーションをデプロイする方法は?

分類Dev

cocoonjs webview +を使用してイオンアプリケーションを構築する方法は?

分類Dev

cocoonjs webview +を使用してイオンアプリケーションを構築する方法は?

分類Dev

アプリケーションを構築したVisualStudioのバージョン番号を取得する方法

分類Dev

角度のあるアプリケーションを構築し、サーバーに配置する

分類Dev

Java Webアプリケーションを構築する方法

分類Dev

サーバーからクライアントコンピュータでJavaアプリケーションを実行する方法は?

分類Dev

AWS CloudFormationアプリケーションロードバランサー-HTTPリスナーをHTTPSリスナーにリダイレクトする方法は?

分類Dev

クライアント時間ではなくサーバー時間を表示するSpringアプリケーション

分類Dev

Webクライアント方式を使用してOOBアプリケーションのサーバーからxmlファイルを取得する方法

分類Dev

ASP.Net MVCを学習し、「/」アプリケーションでユーザーマネージャーサーバーエラーを構築する

分類Dev

クライアントサーバーのJavaアプリケーションを作成する

分類Dev

クライアントサーバーアプリケーションを作成する

分類Dev

クライアント/サーバーアプリケーションで円の色を変更する

分類Dev

サーバークライアントアプリケーションでObjectInputStreamを使用するClassCastException

分類Dev

クライアントとして使用するためのWebサービスを構築する場合、相手のアプリケーションがどの言語でプログラムされているかは重要ですか?

分類Dev

アニメーション化された単語サイクルを正しくラップする方法は?

分類Dev

Sublime Text 3でScalaアプリケーションを構築する方法は?

分類Dev

コマンドライン引数をWindowsアプリケーションに正しく渡す方法は?

分類Dev

'/'アプリケーションのサーバーエラーを解決する方法(構成エラー)

分類Dev

Kestrelサーバーの実行中に.NETコアアプリケーションを構築する

分類Dev

ASP.NET Webサイト用のセキュリティトークンサービス(STS)アプリケーションを構築する

Related 関連記事

  1. 1

    共有ソースを使用してクライアントサーバーアプリケーションを構築するためのMakefile

  2. 2

    共有ソースを使用してクライアントサーバーアプリケーションを構築するためのMakefile

  3. 3

    ExpressJSアプリケーションを構築する方法は?

  4. 4

    JAVAでサーバークライアントアプリケーションを実行する方法

  5. 5

    Java Swingアプリケーションをクライアントサーバーアプリケーションにする方法

  6. 6

    フェニックスで特定の応答のクライアントサブスクリプションを使用してWebソケットサーバーを構築するにはどうすればよいですか?

  7. 7

    クライアントにSQLサーバーデータベースを使用してアプリケーションをデプロイする方法

  8. 8

    クラウドサーバーにlaravelアプリケーションをデプロイする方法は?

  9. 9

    cocoonjs webview +を使用してイオンアプリケーションを構築する方法は?

  10. 10

    cocoonjs webview +を使用してイオンアプリケーションを構築する方法は?

  11. 11

    アプリケーションを構築したVisualStudioのバージョン番号を取得する方法

  12. 12

    角度のあるアプリケーションを構築し、サーバーに配置する

  13. 13

    Java Webアプリケーションを構築する方法

  14. 14

    サーバーからクライアントコンピュータでJavaアプリケーションを実行する方法は?

  15. 15

    AWS CloudFormationアプリケーションロードバランサー-HTTPリスナーをHTTPSリスナーにリダイレクトする方法は?

  16. 16

    クライアント時間ではなくサーバー時間を表示するSpringアプリケーション

  17. 17

    Webクライアント方式を使用してOOBアプリケーションのサーバーからxmlファイルを取得する方法

  18. 18

    ASP.Net MVCを学習し、「/」アプリケーションでユーザーマネージャーサーバーエラーを構築する

  19. 19

    クライアントサーバーのJavaアプリケーションを作成する

  20. 20

    クライアントサーバーアプリケーションを作成する

  21. 21

    クライアント/サーバーアプリケーションで円の色を変更する

  22. 22

    サーバークライアントアプリケーションでObjectInputStreamを使用するClassCastException

  23. 23

    クライアントとして使用するためのWebサービスを構築する場合、相手のアプリケーションがどの言語でプログラムされているかは重要ですか?

  24. 24

    アニメーション化された単語サイクルを正しくラップする方法は?

  25. 25

    Sublime Text 3でScalaアプリケーションを構築する方法は?

  26. 26

    コマンドライン引数をWindowsアプリケーションに正しく渡す方法は?

  27. 27

    '/'アプリケーションのサーバーエラーを解決する方法(構成エラー)

  28. 28

    Kestrelサーバーの実行中に.NETコアアプリケーションを構築する

  29. 29

    ASP.NET Webサイト用のセキュリティトークンサービス(STS)アプリケーションを構築する

ホットタグ

アーカイブ