このディレクトリの索引

# ただし、以下の条件を満たすようにすること 
# クライアントでquitが入力された場合、クライアントは接続を切りプログラムを 
# 終了し、サーバは接続が切れたら、次のクライアントの接続を待つ。 
# サーバでquitが入力された場合、サーバは接続を切り、次のクライアントの 
# 接続を待ち、クライアントは接続が切られたらプログラムを終了する 
# エンターキーのみが入力された場合は、文字列を送らずもう一度文字列を 
# 入力させて、その文字列を送るようにする 

メッセージの送受信(Input,Output,_クライアントからのメッセージ,_サーバからのメッセージ) :-
    write_formatted('%t\n',[_クライアントからのメッセージ]),
    get_line(_サーバからのメッセージ),!.

応答型サーバ(_ポート,_ログ) :-
    socket(internet,stream,Socket),
    socket_bind(Socket,_ポート),
    応答型サーバ(Socket,[],_ログ),
    socket_shutdown(Socket).

応答型サーバ(Socket,[[end_of_file,_]|R],R) :- !.
応答型サーバ(Socket,[[A,quit]|R],[[A,quit]|R]) :- !.
応答型サーバ(Socket,L1,L2) :-
    socket_listen(Socket),
    socket_accept(Socket,Host : _ポート2,NewSocket),
    open(NewSocket,read,Input),
    open(NewSocket,write,Output),
    メッセージの送受信(Input,Output,_クライアントからのメッセージ,_応答型サーバからのメッセージ),
    close(Input),
    close(Output).
    socket_shutdown(NewSocket),
    応答型サーバ(Socket,[[クライアントからの_メッセージ,_応答型サーバからのメッセージ]|L1],L2).

サーバメッセージの送信(Output,quit) :- !.
サーバメッセージの送信(Output,_メッセージ) :- put_line(Output,_メッセージ),!.

クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :-
    クライアント通信確立(_ホスト, _舫, _差し込み口),
    open(_差し込み口, read, _入力),
    open(_差し込み口, write, _出力),
    クライアント送受信(_ホスト,_舫,_送信メッセージ,
                        _入力, _出力,_受信文字コードならび),
    close(_入力),
    close(_出力),
    socket_shutdown(_差し込み口),
    atom_codes(_受信文字列,_受信文字コードならび),!.

クライアント(_ホスト,_舫,_差し込み口) :-
    クライアント通信確立(_ホスト, _舫, _差し込み口),
    open(_差し込み口, read, _入力),
    open(_差し込み口, write, _出力),
    write('サーバーに送信するメッセージを入れてください : '),
    get_line(_送信メッセージ),
    クライアント送受信(_ホスト,_舫,_送信メッセージ,
                        _入力, _出力,_受信文字コードならび),
    close(_入力),
    close(_出力),
    socket_shutdown(_差し込み口),
    atom_codes(_受信文字列,_受信文字コードならび),
    write_formatted('受信した文字列は %t \n',[_受信文字列]).

クライアント通信確立(_ホスト, _サービス, _差し込み口)
  :-
    定数(_サービス), !,
    net_service(_サービス, tcp, _舫),
    socket(internet, stream, _差し込み口),
    host_addr(_ホスト, Addr),
    socket_connect(_差し込み口, Addr : _舫).

クライアント通信確立(_ホスト, _舫, _差し込み口)
  :-
    整数(_舫), !,
    socket(internet, stream, _差し込み口),
    socket_connect(_差し込み口, _ホスト : _舫).

クライアント(_ホスト,_舫,_送信メッセージ,_受信メッセージ) :-


クライアント送受信(_ホスト,_舫,_送信メッセージ,_入力,_出力,_受信文字コードならび)
  :-
    write_formatted(_出力,'%t\n\n',[_送信メッセージ]),
    flush_output(_出力),
    get_code(_入力,Code),
    クライアント受信(_入力,Code,_受信文字コードならび).

クライアント受信(_入力,(-1),[]) :- !.
クライアント受信(_入力,_文字コード,[_文字コード|R]) :-
      get_code(_入力,_文字コード2),
      クライアント受信(_入力,_文字コード2,R).