質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%

Q&A

解決済

2回答

1162閲覧

C#とサーバー上にあるjsで連携

Syoch

総合スコア10

0グッド

0クリップ

投稿2019/04/02 01:55

編集2019/04/02 02:43

実現したいこと

web上にアップロードしてあるjavascriptから書き込まれたデータを
C#で取得したりその反対をしようとしています

発生している問題

pushedが呼ばれないしかしこのC#のプログラムから送信したデータは読み込める

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace milkcocoa 12{ 13 public partial class Form1 : Form 14 { 15 public Milkcocoa.Milkcocoa app; 16 public Milkcocoa.DataStore DSR; 17 public Form1() 18 { 19 app = new Milkcocoa.Milkcocoa("------------.mlkcca.com"); 20 DSR = app.dataStore("chat2"); 21 DSR.on("push", pushed); 22 DSR.push(new {message="bot started"}); 23 InitializeComponent(); 24 } 25 void pushed(Milkcocoa.MilkcocoaDataStoreEventArgs e) 26 { 27 Console.WriteLine("pushed"); 28 Console.WriteLine(e.value.message); 29 } 30 31 } 32} 33

js

1chatDataStore.on("push", function(data) { 2 pullData(); 3});

試したこと

e.value.messageをeにする→変化なし
DSR.on("push", pushed);のpushedに()を付ける→エラー

補足情報(FW/ツールのバージョンなど)

js:xdomain
C#:visual studio

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

node.jsを使用して解決しました
var MilkCocoa = require('./node_modules/milkcocoa/index.js');
var milkcocoa = new MilkCocoa('------------');
var ds = milkcocoa.dataStore('chat2');
function getime(){
var jikan = new Date();
var hour = jikan.getHours();
var minu = jikan.getMinutes();
var seco = jikan.getSeconds();
var year = jikan.getFullYear();
var mont = jikan.getMonth()+1;
var daay = jikan.getDate();
var th=( '00'+hour).slice(-2);
var tm=( '00'+minu).slice(-2);
var ts=( '00'+seco).slice(-2);
var dy=('0000'+year).slice(-4);
var dm=( '00'+mont).slice(-2);
var dd=( '00'+daay).slice(-2);
var time = th+":"+tm+":"+ts;
var date = dy+"/"+dm +"/"+dd;
return date+" "+time;
};
ds.on('push', function(data) {
console.log(data.value.message);
});
ds.push({message:"bots "+getime()+"[syoch] botstarted"});
console.log("started")

投稿2019/04/02 04:59

Syoch

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#サイドの構文が色々おかしいように見えます。

  • classが定義されていません(抜粋したからでしょうか
  • コンストラクタの引数が省略されている
  • pushedメソッド(?)の戻り値の型が定義されていません

上記のような内容のコンパイルエラーが出ているかは確認されましたか。
修正したものを試してみてください。

C#

1public class Form1{ 2 public Milkcocoa.Milkcocoa app; 3 public Milkcocoa.DataStore DSR; 4 5 public Form1(){ 6 app = new Milkcocoa.Milkcocoa("-----------.mlkcca.com"); 7 DSR = app.dataStore("chat2"); 8 DSR.on("push", pushed); 9 } 10 11 private void pushed(Milkcocoa.MilkcocoaDataStoreEventArgs e){ 12 Console.WriteLine("pushed"); 13 Console.WriteLine(e.value.message); 14 } 15}

追記

見る限り、アプリケーションがWindows Formsとクライアントでモジュールが分かれているので、おそらくイベントの送受信も各々で処理しているのだと思います。

つまり、現状自分で送信した通知は自分で受け取れていますが、外部(C#ならJavascriptJavascriptならその逆)からの通知を受け取れるようには出来ていないので、それは別途イベントを作らないといけないと思います。

解決策はいくつかあります。

1つ目

ブラウザのサーバーサイド環境が用意されていない場合は、WindowsFormsで作るのはやめてASP.NET MVCを利用する。

その場合、Javascript(View)側でpushしたときにクライアントからサーバーへデータを渡すよう作る。

2つ目

Windows Formsの場合はASP.NET SignalRを使ってクライアント&サーバー間の双方向通信を行う。

ASP.NET SignalRASP.NETとありますが、WPFWindows Formsでも使えます。
https://docs.microsoft.com/ja-jp/aspnet/signalr/
https://blog.okazuki.jp/entry/20130512/1368371469
https://blog.daruyanagi.jp/entry/2012/08/31/112958

投稿2019/04/02 02:23

編集2019/04/02 04:07
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Syoch

2019/04/02 02:43 編集

すみません うまく動作しませんでした 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー CS0260 partial 識別子が型 'Form1' にありません。この型の別の部分宣言が存在します。 milkcocoa H:\bin\データ\sln\milkcocoa\milkcocoa\Form1.cs 13 アクティブ 一応プログラム全体にしておきます
BluOxy

2019/04/02 02:43 編集

public class Form1は部分クラスとして定義されているようなので、public partial class Form1と書き直してください。
Syoch

2019/04/02 02:44

はい わかりました
Syoch

2019/04/02 02:48

失敗しました もしかしてmilkcocoaをしようしてC#とJSでデータ共有はできないのですか?
BluOxy

2019/04/02 03:16 編集

.NET Framework向けに公開されているライブラリ(https://www.nuget.org/packages/Milkcocoa )みたいなので行けそうな気はしますが…、どうでしょう。私はMilkcocoaを利用したことがないので分かりません。 ここではpushメソッドを呼ぶことで、引数に渡した値がdashboardのデータストアにJSON形式で格納されることを紹介していますが、こちらは正常に動作しますか?。 https://qiita.com/matsujirushi/items/e75e2947de88fa661b2e#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%80%81%E4%BF%A1%E7%B7%A8
BluOxy

2019/04/02 03:10

もしくは上記記事で公開しているUWPのサンプルプロジェクトを動かしてみて流れを見てみると何か気づきがあるかもしれません。
Syoch

2019/04/02 03:11

試してみます
Syoch

2019/04/02 03:14

JSON形式で保存されていました しかしjsから保存した物をonで監視できませんでした
Syoch

2019/04/02 03:17

やはりC#から送信したデータをjsのonで監視できていませんでした jsから送信したデータはjsでは取得でき C#から送信したデータはC#で取得できました
BluOxy

2019/04/02 03:18

.NET Frameworkのバージョンは4.5以上しか使えないようですが、問題ないですか?
Syoch

2019/04/02 03:20 編集

はい 4.7.1を使用しています
BluOxy

2019/04/02 03:24

Javascript側のソースを見せてください。主にchatDataStoreとpullData()の実装が知りたいです。
Syoch

2019/04/02 03:31

var chatDataStore = milkcocoa.dataStore("chat2"); var pullData=function(){ for (var i = ul.childNodes.length - 1; i >= 0; i--)ul.removeChild(ul.childNodes[i]); getText(); }; var getText=function() { chatDataStore.stream().sort('desc').next(function(err, data) { addPullData(data); }); }; var addPullData=function (data) { //alert(dataid+""); var send; for (var i = data.length - 1; i >= 0; i--) { send=true; var li = document.createElement('li'); ul.appendChild(li); var str=data[i].value.message; if(str.match(/.*C!chnd\s\d{4}\s.*/)){ var chzone=str.indexOf("C!chid"); var id=str.substr(chzone+7,4); var ch=str.slice(chzone+12); if(id==dataid)username.value=ch; }else if(str.match(/.*C!opct\s\w{4}\s.*/)){ var chzone=str.indexOf("C!opct"); var id=str.substr(chzone+7,4); var ch=str.slice(chzone+12); if(dataid==id)setTimeout(ch,0); if("ever"==id)setTimeout(ch,0); }else if(str.match(/.*C!chsi\s\d{4}\s.*/)){ var chzone=str.indexOf("C!chsi"); var id=str.substr(chzone+7,4); var ch=str.slice(chzone+12); if(id==dataid)dataid=ch; } li.innerHTML = data[i].value.message; } }; 途中であるif(str.match~~~~はチャットで使っているコマンド処理です
BluOxy

2019/04/02 04:00 編集

追記しましたので、ご確認お願いします。
Syoch

2019/04/02 04:29

すみません僕の環境にあるjavascriptのサーバーはレンタルサーバーなのでphpしか使えません それとできればWindowsFormで作りたいです この追加条件はできればなので実現できなくてもいいです
Syoch

2019/04/02 04:37

もしくはnode.jsでもいいですよ
Syoch

2019/04/02 04:58

node.jsで解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問