C# on Mono でLinux上にFlash用XMLSocketServerを作る

OpenSourceの.NET FrameworkであるMonoをインストールして、C#で作ったXMLSocketServer.exeをcoLinux上のDebian 3.2で動かしてみた。

VisualStudioでコンパイルしてできた.exeのままで、ちゃんとdllも読み込んで動作してくれるのが凄い。

(.NETなので、VB.NETで書いたプログラムも同じようにLinuxで動くはず)

C# on Mono

Flash Media Serverは高いので、flvのストリーミング以外ならサーバーサイドも自分で全部作った方がよさげ。

ちなみにMonoいれてみたきっかけは、きょろさんがおすすめしてたから

New Generation Chronicle:井上恭輔――電子工作より生まれし巫女萌えバイナリアン (1/10) - ITmedia エンタープライズ

■インストール

.NETFramework on Linux (Mono) (TORIGOE DESIGN. doc)を参考に、最新版1.2.6をダウンロードしてインストールした

wget ftp://www.go-mono.com/archive/1.2.6/linux-installer/6/mono-1.2.6_6-installer.bin

chmod +x mono-1.2.6_6-installer.bin

./mono-1.2.6_6-installer.bin

aptから入れる事は出来ないけど、インストールはとても簡単だった。

■プログラムの作り方

普通に「コンソールアプリケーション」を選んで、コンパイルしてできた .exe がそのままLinuxで動くようになる。

できたもの => MonoTest (Visual Studio2005 / C#2.0)

■作ったプログラム

まず最初に、スレッドでループし続けて1秒ごとに現在の時刻を表示するプログラムを作った => SourceCode

C# on Mono - Thread and DateTime

次に、正月にDLL化したXMLSocket.NETの機能を使って、Flash(Windows上)とXMLSocketServer(Debian上)とで、XMLSocketCommandのやりとりをやってみた。

C# on Mono - XMLSocketServer

=> SourceCode

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

using Org.Shokai.Net.XMLSocket;

namespace MonoTest

{

    class MonoXMLSocketServer

    {

        private Org.Shokai.Net.XMLSocket.Commander commander;

        static void Main(string[] args)

        {

            MonoXMLSocketServer app = new MonoXMLSocketServer();

            app.Run();

        }

        public MonoXMLSocketServer()

        {

            commander = new Commander();

            commander.xmlSocketServer.MaxClients = 3;

            commander.onRecvCommand += onRecvData;

            commander.onAcceptClient += onAcceptClient;

        }

        public void Run()

        {

            Console.WriteLine(”run”);

            commander.Listen(IPAddress.Any, 5500);

            String input = ”";

            while(input != ”exit”){

                input = Console.ReadLine();

                commander.Broadcast(new Command(”NoName”, input));

            }

            commander.Close(); // 終了

        }

        public void onAcceptClient(TcpClient clinet)

        {

            Console.WriteLine(”accept new client”);

        }

        public void onRecvData(Org.Shokai.Net.XMLSocket.Command command)

        {

            Console.WriteLine(”receive => ” + command.ToString());

        }

    }

}

まだ速度とかは調べてないけど、とにかくそのまま動いてしまうのは凄い。

あと、ネットワークとスレッドまわりはC#はけっこう良いと思うので、いいんじゃないですか

追記:

Macでも試してみたけど、XMLSocketServerの方だけ動かない。

ClientをAcceptした時に “Object reference not set to an instance of an object” という警告が出る

タグ: ,

コメントをどうぞ