2015年08月07日

ググっても出なかったので公開してみます。
GitHubへ

使い方
XMLSocket1インスタンスが1コネクションです。
Connectメソッドで指定したところに接続、Disconnectで切断します。
SendメソッドでXMLの文字列データを送信、Receiveメソッドで受信の監視をします。
引数のイベントは成功した時や失敗した時に発生します。

余談

XMLSocketとは
XMLSocketはActionScriptの機能らしいですが、TCPを使ってXML+ゼロ文字を送受信するだけの仕様のようです。
なおちゃんとFlashを作って成否を確認したわけじゃないので間違ってるかもしれません。

C#のSoketについて
ConnectAsync等のSocketAsyncEventArgsを引数に取る関数の仕様がよくわからずNETのソースコードを見て解決しました。
ユニバーサールアプリだとそれらのメソッドしか実装されておらず、TCPClientも消えている為少し苦労しました。

何が作りたかったのか
Windows10でちゃんとした通知機能が実装されたようなので、それを使って生放送などの開始の通知を作ってみる予定でしたが、仕様を詳しく調べると無理そうだったので諦めました。
参考までに、ニコニコ生放送の通知をXMLSocketで受信するサンプルを載せます。
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Xml;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Web.Http;
using AS; public sealed partial class MainPage : Page {  public MainPage()  {   InitializeComponent();  }  ~MainPage()  {   xsock.Dispose();  }  public class AlertInfo  {   public string addr, port, thread;  }  public async Task<AlertInfo> GetAlertInfo()  {
  var ret = new AlertInfo();   using(var hc = new HttpClient())   {    using(var get = await hc.GetAsync(new Uri("http://live.nicovideo.jp/api/getalertinfo")))    {     using(var stream = await get.Content.ReadAsInputStreamAsync())     {      using(var reader = XmlReader.Create(stream.AsStreamForRead(), new XmlReaderSettings() { Async = true }))      {       string name = null;       while(await reader.ReadAsync())       {        if(name == "addr")        {         ret.addr = reader.Value;        }        if(name == "port")        {         ret.port = reader.Value;        }        if(name == "thread")        {         ret.thread = reader.Value;        }        name = reader.NodeType == XmlNodeType.Element ? reader.Name.ToLower() : null;       }      }     }    }   }   return ret;  }  public XMLSocket xsock = new XMLSocket();  AlertInfo alertInfo;  private async void button_Click(object sender, RoutedEventArgs e)  {   alertInfo = await GetAlertInfo();   xsock.Connect(new DnsEndPoint(alertInfo.addr, int.Parse(alertInfo.port)), XSock_Connected,null);  }  private void XSock_Connected(object sender, EventArgs e)  {   xsock.Send($"<thread thread=\"{alertInfo.thread}\" version=\"20061206\" res_from=\"-1\"/>\0", XSock_Sent, null);  }  private void XSock_Sent(object sender, EventArgs e)  {   xsock.Receive(XSock_Received, null);  }  private async void XSock_Received(object sender, XMLSocketOnReceivedArgs e)  {   await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>   {    listBox.Items.Add(e.xml);   });  }  private void button1_Click(object sender, RoutedEventArgs e)  {   xsock.Disconnect();  } }

サンプルについて
実行するためには、ボタン、リストボックスをVS2015の空のユニバーサルアプリプロジェクトに配置する必要があります。
buttonが接続、button1が切断ボタンとなっています。
xsockインスタンスを使って受信したXMLをlistBoxにログとして流しています。
ニコニコ生放送の仕様はこのページを参考にしました。
アラートと生放送コメントの取得は同じ仕様のようなので、同じようにしてコメントビューアも作れると思います。

トラックバックURL

コメントする

名前
 
  絵文字