テキストチャットサーバー

説明

チャットルームのサーバープログラムです。クライアントから送られてきたテキストを、そのチャットルームに接続しているクライアント全部に送ることで、チャットルームの機能を実現しています。

Studioで試す

以下のリンクから Jasmine Tea でこのサンプルプログラムを Studio 画面で開いて実際に試すことができます。

Studio で開く

プログラム

port=8080
server_conn_id$=bind$(port)
if len(server_conn_id$)=0 then
  print "接続受け付けの開始に失敗しました"
  end
end if
clients@=[]
do
  packet@=receive@(server_conn_id$)
  if 0<len(packet@) then
    client_conn_id$=packet@[0]
    message@=packet@[1]
    if message@[0] = 1 then
      request@=[message@[1] + "さんが入室しました"]
      print request@[0]
      result=broadcast(port, request@)
      clients@[len(clients@)] = [client_conn_id$, message@[1]]
    else if message@[0] = 2 then
      request@=[message@[1] + ": " + message@[2]]
      print request@[0]
      result=broadcast(port, request@)
    end if
  end if
  if 0<>len(clients@) then
    clients@=update_clients@(port, clients@)
  end if
loop
function update_clients@(port, clients@)
  ret@=[]
  actual_clients@=connected@(port)
  for i=0 to len(clients@)-1
    client@=clients@[i]
    gone=-1
    for j=0 to len(actual_clients@)-1   
      if actual_clients@[j]=client@[0] then
        gone=0
      end if
    next
    if gone then
      message$ = clients@[i][1] + "さんが退出しました"
      print message$
      result=broadcast(port, [message$])
    else
      ret@[len(ret@)]=clients@[i]
    end if
  next
  return ret@
end function
function broadcast(port, message@)
  clients@=connected@(port)
  for i=0 to len(clients@)-1
    result=send(clients@[i], message@)
    if not result then
      print "送信エラー"
    end if
  next
  return -1
end function

解説

このプログラムは、ネットワーク経由でメッセージを送受信するチャットサーバーを実装しています。最初にサーバーは指定されたポート番号(8080)で起動し、そのポートにバインドします。バインドが成功したかどうかを確認し、失敗した場合にはエラーメッセージを表示してプログラムを終了します。

プログラムはクライアントからの接続を待ち受け、受信したメッセージに基づいて異なるアクションを行います。クライアントからのメッセージは2種類あり、1つは新しいクライアントがチャットに参加することを示す入室メッセージ、もう1つは通常のチャットメッセージです。入室メッセージを受信すると、サーバーは「○○さんが入室しました」というメッセージを全クライアントにブロードキャストし、新しいクライアントをクライアントリストに追加します。通常のチャットメッセージを受信すると、そのメッセージを全クライアントにブロードキャストします。

サーバーは定期的に接続中のクライアントリストを更新し、接続が切れたクライアントがいるかをチェックします。接続が切れたクライアントが確認されると、「○○さんが退出しました」というメッセージを残りのクライアントにブロードキャストし、そのクライアントをリストから削除します。

このプログラムには update_clients@ と broadcast の2つの関数が含まれています。update_clients@ 関数は、接続中のクライアントと保存されたクライアントリストを比較し、退出したクライアントを特定して処理します。broadcast 関数は、指定されたメッセージを接続中の全クライアントに送信し、送信に失敗した場合にエラーメッセージを表示します。

全体として、このプログラムはクライアントの接続、メッセージの受信と送信、クライアント状態の管理を行い、簡易チャットサービスの機能を提供しています。