【ドリトル掲示板】

プログラミング言語「ドリトル」の質問と回答をお気軽に書いてください。新規の書き込みは画面のいちばん下にあります(背景が薄緑色の部分)
・最新の情報は作者のBlogドリトルのページをご覧ください。
・詳しい情報交換はユーザーフォーラムで行われています。初めての方はアカウントを作成してログイン後、ドリトルのコースに参加して「このコースを登録する」をクリックしてください。ゲストによる閲覧も行えます。


個別に送受信したい

1:yamaji :

2020/05/20 (Wed) 11:18:16

はじめまして。
ドリトルによるプログラミング学習を参考にしながら、チャットのプログラムまでなんとか作成して確認しました。
serverが起動できて、双方向通信が確認できて素晴らしい教材だと思います。

中学校技術科におけるドリトルを利用した通信プログラムの実践
の図11のように個別に送受信するようなプログラムを作りたいのですが、いろいろプログラムを変更して試みたのですがうまく動作させることができません。
ご教授いただけるとありがたいです。
よろしくお願いいたします。
13:yamaji :

2020/06/08 (Mon) 13:00:24

いつもお世話になっております。
返信ありがとうございます。
自分でも色々いじってみて、クライアント側は何とか動作できたのですが、サーバ側で詰まってしまって立ち往生していました。
本当にありがとうございます。
活用できるよう、授業パッケージを作成したいと思います。
12:honda :

2020/06/02 (Tue) 02:17:03

yamajiさん、開発チームの本多です。

バージョン2.39でも工夫次第で実現可能です。
内容部分と申しますと、クライアントプログラムの
『内容=宛先+"/"+送信者名+":"+メッセージ。』
の行でしょうか?
2.39ですと、以下のように修正いただくと動作するかと思います。
『内容=(宛先!読む)+"/"+(送信者名!読む)+":"+(メッセージ!読む)。』

辞書についてですが、以下のプログラムをdolittle.jarと同じフォルダに「辞書.ini」として保存した上で、
各プログラムの先頭で『システム!"辞書"使う。』のように宣言していただくと、2.39でも辞書オブジェクトの一部が使えるようになります。
(お渡ししているサンプルの範囲であれば動きます。)

======辞書.ini=====
辞書=""。
辞書:探す=「|キー;i|
  i=-1。
  自分:データ!「|要素 j|
    「(要素!1 読む)==キー」!なら「i=j」実行。
  」それぞれ実行。
  i。
」。
辞書:書く=「|キー 値;位置|
  「自分:データ==未定義」!なら「自分:データ=配列!作る」実行。
  位置=自分!(キー)探す。
  「位置==-1」!なら「
    自分:データ!(配列!(キー)(値)作る)書く。
  」そうでなければ「
    自分:データ!(位置)読む 2(値)上書き。
  」実行。
  自分。
」。
辞書:読む=「|キー|
  「自分:データ==未定義」!なら「自分:データ=配列!作る」実行。
  位置=自分!(キー)探す。
  「位置==-1」!なら「
    ""
  」そうでなければ「
    自分:データ!(位置)読む 2 読む。
  」実行。
」。
11:yamaji :

2020/05/26 (Tue) 14:19:49

いつもお世話になっております。
早々にお返事を折り返して、いただきありがとうございます。
本日学校の環境下で動作を確認できる機会があり頑張っている所です。
ですが、学校でのバージョンが2.39になっており、辞書とテキストエリアと内容部分のaddができず、辞書は配列に置き換え、テキストエリアはフィールドに置き換えてみました。
内容部分のaddも配列に置き換えれば良いのかもとは思うのですが、まだ上手く動いておりません。
ずっと自宅の環境下で確認しておりバージョン確認を怠ってしまった為、お手を煩わせたのに申し訳ない結果になっております。
バージョンアップも含め検討事項ですが、低いバージョンでも作り込み方を変えれば動作が可能でしょうか?
上位のDNSの部分もまだ動作確認が出来ず、せっかく考えて頂いたのに、大変心苦しく思いますが、ご回答頂けると助かります。

よろしくお願いいたします。
10:honda :

2020/05/25 (Mon) 16:14:11

開発チームの本多と申します。

上位のDNSサーバのサンプルプログラムを作ってみました。
先にお渡ししたDNSサーバのプログラム、
クライアントのプログラムと共にお使いください。
クライアントのプログラムの接続先IPアドレスをこちらの上位のDNSサーバのプログラムが動いているPCのIPアドレスに変更いただく必要があります。

また、留意する点がございます。
40人が同時にこのチャットシステムを使う場合、
同時にサーバの値を変更してしまう「コンフリクト」が多発する可能性が高いです。
そのため、送ったのに届かない、という自体が頻発する可能性があります。
基本的には、多くても10人程度のグループが良いかと考えています。

ご参考にしていただければ幸いです。

=====
サーバリスト=辞書!作る。
サーバリスト!"サーバ1" "192.168.10.1" 書く。 // DNSサーバ1のアドレス
サーバリスト!"サーバ2" "192.168.10.2" 書く。 // DNSサーバ2のアドレス
サーバリスト!"サーバ3" "192.168.10.3" 書く。 // DNSサーバ3のアドレス
サーバ1=配列!"ほんだ" "おおむら" 作る。
サーバ2=配列!"かねむね" "かめた" 作る。
サーバ3=配列!"かめこ" "かめきち" 作る。
ラベル!"ログ:"作る。
ログエリア=テキストエリア!作る 500 100 大きさ 自動改行。
ログ出力=「|ログ|ログエリア!(ログ)書く」。
サーバ!"localhost" 接続。
サーバ!"msg" "" 書く。
送信=「|サーバ名 メッセージ|
  アドレス=サーバリスト!(サーバ名)読む。
  ログ出力!(アドレス+" | "+メッセージ)実行。
  サーバ!(アドレス)接続。
  サーバ!"msg"(メッセージ)書く。
  サーバ!"localhost"接続。
」。
探す=「|アドレスリスト 宛先|
  ヒット?=(アドレスリスト!「|名前| 名前==宛先」選ぶ 要素数?)>0。
  ヒット?。
」。
サーバ検出=「|宛先|
  検出されたサーバ=""。
  「(探す!(サーバ1)(宛先)実行)==はい」!なら「
    検出されたサーバ="サーバ1"。
  」そうでなければ「(探す!(サーバ2)(宛先)実行)==はい」なら「
    検出されたサーバ="サーバ2"。
  」そうでなければ「(探す!(サーバ3)(宛先)実行)==はい」なら「
    検出されたサーバ="サーバ3"。
  」実行。
  検出されたサーバ。
」。
タイマー!作る 60 時間「
  msg=サーバ!"msg" 読む。
  「 msg!="" 」!なら「
    内容=msg!"/" 分割。
    宛先=内容!1 読む。
    サーバ名=サーバ検出!(宛先)実行。
    「 サーバ名!="" 」!なら「
      送信!(サーバ名)(msg)実行。
    」そうでなければ「
      ログ出力!("宛先不正 → " + 宛先)実行。
    」実行。
    サーバ!"msg" "" 書く。
  」実行。
」実行。
=====
9:honda :

2020/05/23 (Sat) 18:57:44

yamajiさん、開発チームの本多と申します。

ご興味を持っていただけて、大変嬉しく思います。
DNSサーバの分散、サーバのログ共に可能です。

DNSサーバの分散の件につきましては、
上位のDNSサーバのプログラムを新たに作る必要があります。
が、サンプルとしてお渡ししたDNSサーバのプログラムを改変することで実装出来るかと思います。
アドレス帳の情報を、
「DNSサーバが持つクライアントのリストと、DNSサーバのIPアドレス」というように改変することで可能になります。

サーバのログの件につきましては、
ログ情報の出力用にテキストエリアオブジェクトを作っておき、
メッセージを受信するたびにそのテキストエリアオブジェクトに情報を書き込んでいくと実現出来るかと思います。

サンプルも作ってみますので、少々お待ちください。
8:yamaji :

2020/05/23 (Sat) 17:00:38

すいません。
もう一つ質問です。
サーバの動きを観察できるようなログを見るようなことはできますか?
これもお手すきの際でよいのでご教授いただけるとうれしいです。
よろしくお願いいたします。
7:yamaji :

2020/05/23 (Sat) 16:56:30

おせわになっております。
早々のメッセージありがとうございます。
早速動作を確認して、ドリトル、こんなことまでできるなんて、秀逸に作られているんだと感動しました。

実行した後、組まれたプログラムを一生懸命解読していくうちに、コマンドの作り方やループについてなど理解を深めることができました。
台数が手元に2台しかないので、複数台でも実行してみたいと思います。

最大クライアントが40台になるので、DNSサーバを分散させてDNSサーバ同士をつないで、例えばDNS Aサーバの下のクライアントとDNS Bのクライアントがつなげたりするとトラフィック分散のイメージも付きやすいと思うのですが、可能でしょうか?

いろいろできるので、楽しくなってしまい出来たらいいながたくさん生まれてしまいました。。
ご迷惑でなければご解答頂けると助かります。
よろしくお願いいたします。
まだまだ未熟ですが、自分なりにも考えてみたいと思います。
6:honda :

2020/05/22 (Fri) 20:52:34

これらのプログラムは、次の手順でご確認いただけます。
参考にしていただければ幸いです。
=====
1.PC1でドリトルを起動し、サーバを起動
2.PC2でドリトルを起動し、サーバを起動
3.PC1にDNSサーバのプログラムを貼り付け、「// ほんださんのアドレス」の行を適切な名前とPC2のIPアドレスに書き換える
4.PC2にクライアント側のプログラムを貼り付け、「//DNSサーバのアドレス」の行をPC1のIPアドレスに書き換える
5.PC1とPC2のプログラムをそれぞれ実行
6.PC2の実行画面から「宛先」に3.で設定した名前を入力し、送信者名とメッセージに適当な文字列を入れて送信ボタンを押下
7.PC2の実行画面の「受信メッセージ」の欄にメッセージが正しく表示されているかを確認
=====
5:honda :

2020/05/22 (Fri) 20:48:59

次に、クライアントサイドのプログラムです。

このクライアントは、メッセージを受信するサーバも兼ねています。
送信の際にはDNSサーバのIPアドレス、
受信の際にはlocalhostというように接続先が切り替わります。

=====
//以下、送信用プログラム
ラベル!"宛先:"作る。
宛先=フィールド!作る。
ラベル!"送信者名:"作る 次の行。
送信者名=フィールド!作る。
ラベル!"メッセージ:"作る 次の行。
メッセージ=テキストエリア!作る。
送信ボタン=ボタン!"送信"作る 次の行。
送信ボタン:動作=「
内容=宛先+"/"+送信者名+":"+メッセージ。
サーバー!"192.168.10.8" 接続。//DNSサーバのアドレス
サーバー!"msg"(内容)書く。
サーバー!"localhost" 接続。
」。

//以下、受信用プログラム
サーバー!"localhost" 接続。
サーバー!"msg" "" 書く。
ラベル!"受信メッセージ" 作る 次の行。
受信欄=リスト!作る。
タイマー!作る 60 時間「
msg=サーバー!"msg" 読む。
「 msg!="" 」!なら「
受信欄!(msg)書く。
サーバー!"msg" "" 書く。
」実行。
」実行。
=====
4:honda :

2020/05/22 (Fri) 20:44:34

yamajiさん、開発チームの本多と申します。

DNSサーバの仕組みを自分でプログラミングしてみるのはとても良い学習になりそうですね:-)
DNSサーバのプログラムと、クライアントのプログラムを作ってみました。

まずはDNSサーバのプログラムです。
クライアントの情報を持つアドレス帳を、名前とIPアドレスをセットで記憶する連想配列として表現しました。
クライアントから「ほんだ/かめた:こんにちは」という形式でメッセージが送られてくる想定です。
その送られてきたメッセージを「ほんだ」と「かめた:こんにちは」という形に分割し、
宛名から適切なIPアドレスを読み出し、接続して送信するという形になっています。
======
アドレス帳=辞書!作る。
アドレス帳!"ほんだ" "192.168.10.1" 書く。 // ほんださんのアドレス
アドレス帳!"おおむら" "192.168.10.2" 書く。 // おおむらさんのアドレス
アドレス帳!"かねむね" "192.168.10.3" 書く。 // かねむねさんのアドレス
サーバー!"localhost" 接続。
サーバー!"msg" "" 書く。
送信=「|宛先 メッセージ|
アドレス=アドレス帳!(宛先)読む。
サーバー!(アドレス)接続。
サーバー!"msg"(メッセージ)書く。
サーバー!"localhost"接続。
」。
タイマー!作る 60 時間「
msg=サーバー!"msg" 読む。
「 msg!="" 」!なら「
内容=msg!"/" 分割。
宛先=内容!1 読む。
メッセージ=内容!2 読む。
送信!(宛先)(メッセージ)実行。
サーバー!"msg" "" 書く。
」実行。
」実行。
======
3:yamaji :

2020/05/21 (Thu) 09:01:41

お世話になっております。
早々のご返信ありがとうございました。
早速勉強させていただきました。
すごくわかりやすく、丁寧に返信していただいたので、助かりました。
ありがとうございます。

もう一つ質問があるのですが、サーバを立てているパソコンで簡易のDNSサーバのように人の情報を持っていて、クライアント側が送信する時、
宛先:○○
メッセージ入力
送信ボタン
のような形で作成したとき、サーバの持っているリストから宛先を検索して送信したり、することはできますか。
受信もリストで振り分けるようなことは可能なのでしょうか。これができるとサーバとクライアントの役割がより伝わりやすくなる気がするので、考えているのですが検索部分で煮詰まっています。
厚かましいお願いですが、ご教授いただけると助かります。
よろしくお願いいたします。



2:omura :

2020/05/20 (Wed) 18:09:49

お褒めの言葉をいただき開発メンバー 一同、とてもうれしく感じております。

ご質問いただいた件ですが、ポイントが2つあります。
説明が少しややこしいので、説明の最後にサンプルプログラムへのリンクを付けました。
こちらを見ながら(動かしながら)読んでいただくとよいかと思います。



(1)2者間の送信と受信のそれぞれのデータに名前をつける

ドリトルにてデータを通信しあう際には、そのデータ(オブジェクト)に名前を付けます。
(「サーバー! "XXX" "YYY" 書く。」のXXXの部分です)
ご検討されているプログラムの場合は、通信する相手ごとに、被らないように、名前を付けることが望まれます。
たとえば「おおむら」、「ほんだ」、「かねむね」の3名で通信するときは、下記の向きに通信が行われます。
このそれぞれに、名前を付ける必要があります。
・おおむら -> ほんだ
・ほんだ -> おおむら
・おおむら -> かねむね
・かねむね -> おおむら
・ほんだ -> かねむね
・かねむね -> ほんだ

サンプルプログラムでは”Msg〇to×”となってる箇所が、それぞれの向きで送るデータにつけた名前です。



(2)使う部品の名前を変える。
ボタンとフィールドの部品を使って送受信の項目を作っています。
この際、「作る」の命令で作った部品の名前が被っていると、正しく動作しなくなってしまう可能性があります。
(「〇〇 = XXX !作る。」と書いている箇所の〇〇の部分です)
プログラムをコピーして作る場合に陥りやすい箇所なので注意してください。

サンプルプログラムですと、受信1と受信2,送信1,送信2などがこの部分にあたります。



■サンプルプログラム
「おおむら」、「ほんだ」、「かねむね」の3名を想定して、
「中学校技術科におけるドリトルを利用した通信プログラムの実践」の図11と同様のプログラムを作った場合のプログラムを下記に置いておきました。
ご理解の一助となればと存じます。

http://garakuta-lab.sakura.ne.jp/dolittle/sample/dolittle_sendMsg.zip
(一定期間たつと消してしまう場合があるので、ダウンロードは早めにお願いしたく存じます。)

  • 名前: E-mail(省略可):

Copyright © 1999- FC2, inc All Rights Reserved.