// Use this for initialization

仰々しいタイトルですが、要は同期+スレッドと非同期のどちらがいいのかという話しです。「C#でTCPサーバーの実装を作ったよ」というレポートはかなり多くて、www.codeproject.comなんかで検索すると10件近く出てきます。日本語の情報もいくつかあり、チュートリアル的な情報では、まずは同期式で勉強してから非同期でという流れが多いですね。Unityを始めてまず「オンラインゲームのしくみ」を読んだのですが、この本の場合は非同期で作るのは大変だから同期でつくろうよというスタンス。この本のライブラリを使ってコーディングを始めたのですが、このライブラリが複数接続に対応しておらず、結局作り直しになりました。で、色々と見て回ったところ同期ベースか非同期ベースかというところで大きく分かれているので、自分はどちらでいこうかと迷い、メリット・デメリットを検討してみました。で、同期の方のメリットは、結局、スレッドプログラミングになれている場合には、プログラムの構造がわかりやすい、つまり書きやすいというところに尽きるようで、他のメリットは見あたりませんでした。僕の場合、マルチスレッドは使ったことが無いのであまりメリットは感じられず、スレッドがメモリを食う、オーバーヘッドが大きいというデメリットの方が大きく感じました。サンプルコードを見ていると、非同期式でもそれほど複雑なプログラムにはならなさそうなので、非同期で実験してみることにしました。で、MSDNのサンプルコードを使ってUnity上でTCPサーバーを非同期で実行するためのサンプルがこちら。いわゆるチャットサーバーですね。いくつかはまりポイントがまたありましたが、概ねスムーズに書けました。ncコマンドで複数の端末から接続すると、それぞれに固有番号を振った上で、ある端末のメッセージが全端末に送信されます。接続切断はまだ未実装です。ちょっと困ったなと思うのはどうにもコードが肥大する感じで見にくいです。クラス化しようかと思ったのですが、コールバックはビジネスロジック側で実装しないと意味が無くて、サイズを取っているのがコールバックなので、クラスにしてもあまり意味が無い感じがしました。デリゲートで作れるとは思うのですが、このあたりはまだ慣れていないので余力があれば書こうと思います。

// There could be Copyright (c) of Microsoft and Yasuo Kawachi// If there is, this code is licensed under Microsoft Limited Public License// https://msdn.microsoft.com/en-US/cc300389 See ""Exhibit B""// I belive there is no copyright due to non creativityusing UnityEngine;using System.Collections;using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Collections.Generic;public class Main : MonoBehaviour {"

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です