【コラム】

日本語で10行プログラミング

53 10行でチャットソフトを作る(2)

    クジラ飛行机  [2006/03/28]

    チャットソフトの仕組み

    前回までのプログラムは一方通行でした。クライアントがサーバーに接続して、メッセージを送信すると、サーバーがメッセージを受け取ってクライアント側の画面に表示するという単純なものでした。

    しかし、チャットと言えば、複数人が同時に使うもので、誰かが発言するとその内容がクライアント全員の画面に表示されるというものです。これを実現するために、もう少しサーバーとクライアントの役割分担を決めていきます。

    前回までのサーバーとクライアントの役割は以下のようになっていました。

    • 「サーバー」は、クライアントが接続してくるのを待つ役割
    • 「クライアント」は、サーバーへ接続するという役割。ここではチャットの参加者を指す

    このときクライアントは、サーバーのIPアドレスを指定して接続します。そのため、1つのクライアントでは、1つのサーバーにしか接続できません。しかし、サーバーは複数のクライアントを同時につなげておくことができます。

    1つのサーバーに対し複数のクライアントが接続できます

    そこでサーバーはクライアントから受信したメッセージを全てのクライアントに送り返し、クライアントはサーバから受信したメッセージを画面上に表示するという仕組みにしておきます。すると、クライアントの誰かが発言したメッセージを、サーバーに接続しているクライアント全員に届けることが可能になります。

    今回のサーバーとクライアントの役割

    今回作るチャットソフトの、サーバーとクライアントの役割を個条書きにしてみます。

    「サーバー」側

    • クライアントが接続してくるのを待つ
    • クライアントの誰かがメッセージを送信するのを待つ
    • メッセージを受信したら、そのメッセージをクライアント全員に送信する

    「クライアント」側

    • サーバーに接続する
    • サーバーにメッセージを送信する
    • サーバーからメッセージが届いた画面に表示する

    この動きを作れば、チャットソフトの基本ができるでしょう。

    10行チャットの作成

    それでは上記のサーバーの動きを、実際になでしこのプログラムに直していこうと思います。

    以下がサーバー側のプログラムです。

    !「nakonet.nako」を取り込む。#1
    サーバーとはTCPサーバー。#2
    サーバーのポートは10001 #3
    サーバーを開始。#4
    サーバーで受信した時は #5
      データは、サーバーの受信データ。#6
      データを表示。#7
      データをサーバーで全送信。#8

    ほとんど、前回と変わりありません。今回増えた役割を行っているのが8行目で、クライアント全員へメッセージを送る処理をしています。ここではTCPサーバーの「全送信」命令を使って実行しています。

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

    !「nakonet.nako」を取り込む。#1
    クライアントとはTCPクライアント。#2
    そのホストは「127.0.0.1」。そのポートは10001。#3
    その受信した時は~クライアントで受信して表示。#4
    その接続した時は~ #5
      オンの間 #6
        「何を送信しますか?」と尋ねる。#7
        もし、それが空ならば、終わり。#8
        それをクライアントで送信。#9
    クライアントで接続。#10

    クライアント側のプログラムも前回とほとんど同じです。ただし、メッセージを受信すると、そのデータ(この話の場合、受信したメッセージ)が自動的に変数「受信データ」へ代入されるサーバーに対し、クライアントでは、明示的に「受信」命令を実行し、サーバーからのメッセージを受ける必要があります。

    今回は上記の命令を実行し、かつサーバーから送られてきたメッセージを表示するため、4行目にイベント「受信した時は~」を追加しています。

    チャットを実行してみよう

    本当に複数のクライアントが1つのサーバーに接続できるのか実験してみましょう。このプログラムでは、接続先のサーバーを「127.0.0.1」としています。「127.0.0.1」のアドレスは、自分自身を表すため、パソコンがネットワークにつながっていなくても、チャットのテストを行うことができます。

    はじめに、サーバー1つと、クライアントを2つ(それぞれA、Bとします)起動してみてください。クライアントAで発言すると、次の画面のように、発言したクライアントAに加え、もう1つのクライアントBにも同じ発言が表示されます。

    また、クライアント側の3行目にあるサーバーのIPアドレスを実際にネットワーク上にあるパソコンのIPアドレスに変更することで、離れた場所のパソコンともチャットを楽しむことができると思います。

    チャットプログラムを実行してみたところ

    チャットクライアントの改造

    さて、今回、10行で作ったチャットソフトにも欠点があります。それは、いくつか発言が続くと画面をはみ出してしまうことです。今回は発言を表示するのに、なでしこの「表示」命令を使っているためです。

    この命令だけでは、挨拶をしたくらいでお互いの発言が読めなくなってしまいます。また、発言だけが表示されるので誰の発言かが分からず、3人以上でチャットしたとき混乱してしまうかもしれません。

    そこで、以下の機能を追加してみます。

    • クライアントで発言するときに、ログインユーザー名を一緒につけて表示する
    • メッセージを表示するのにメモ部品を使って、メッセージが消えないようにする

    この2機能を追加するには、クライアント側を改良します。

    !「nakonet.nako」を取り込む。#1
    ログとはメモ。そのレイアウトは「全体」#2
    クライアントとはTCPクライアント。#3
    そのホストは「127.0.0.1」。そのポートは10001。#4
    その受信した時は~#5
      クライアントで受信。ログ=それ&改行&ログ。#6
    その接続した時は~ #7
      オンの間 #8
        「何を送信しますか?」と尋ねて、発言に代入。#9
        もし、発言が空ならば、抜ける。#10
        「{ユーザー名取得}:{発言}」をクライアントで送信。#11
    クライアントで接続。#12

    クライアント側を改良してみました

    このプログラムでは、2行目でログという名前のメモ部品を作成し、6行目で受信した発言が表示されるようになっています。最新の発言がメモの最上部に表示されるので、続けて長く会話をしても誰がどのような発言をしたか認識できるようになっています。

    さらなる改良を目指して

    さて、実際にここまでで作ったプログラムを使って遊んでみると、さらに改良すべき点が見つかることと思います。まず、クライアント側で「尋ねる」命令を使ってユーザーの発言を入力しているので、自由にウィンドウが操作できません。そして、サーバーのアドレスをプログラムに埋め込んでいるので、サーバーを変更するたびにプログラムを書き換える必要があります。プログラムの実行時に、サーバーのIPアドレスを入力できるようにしたいものです。

    実は、なでしこ本体のサンプルプログラムの中にも、チャットソフトが収録されています。ですから、それを参考にしながら独自の改良を加えたオリジナルチャットソフトを作ってみてください。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン