※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

ChatProject開発メモ

 Delphi 6 Personalで開発中のChatProjectについての覚書。

CONTENTS

接続処理

  1. Internetタブより、コンポーネントを選んでフォームに配置する。
    1. サーバ用ならばServersocket。
    2. クライアント用ならばClientsocket。
    3. サーバ・クライアント兼用ならば両方。
      以降の処理も、サーバ用かクライアント用かで条件分岐し処理する。
  2. IPアドレスとポート番号を指定する。
    1. サーバの場合、ServerSocket.Portにポート番号をセット。
    2. クライアントの場合、ClientSocket.AddressにサーバのIPアドレス、
                  ClientSocket.Portにポート番号をセット。
  3. SocketをOpenする、またはActiveプロパティをTrueにする。
    1. サーバの場合、ServerSocket.Open、またはServerSocket.Active := True。
    2. クライアントの場合、ClientSocket.Open、またはClientSocket.Active := True。
var IsServer : Boolean; // 起動モードフラグ。True=サーバ、False=クライアント。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsServer then // サーバモードならば
  begin
    ServerSocket1.Port := 0; // ポート番号指定
    ServerSocket1.Open;      // サーバとして通信オープン
  end
  else             // クライアントモードならば
  begin
    ClientSocket1.Address := '127.0.0.1'; // IPアドレス指定
    ClientSocket1.Port := 0; // ポート番号指定
    ClientSocket1.Open;      // クライアントとして通信オープン
  end;
end;

多人数チャット

  1. 接続を管理しているのはサーバなので、サーバがクライアント間の送受信を仲介する。
    1. ServerSocket.ServerTypeをstNonBlockingに設定。
    2. サーバに接続中のクライアント数は、ServerSocket.Socket.ActiveConnectionsで取得可能。
  2. サーバがデータを送信する際は、全クライアントにデータ送信する。
    1. クライアントがデータを送信する際は、クライアントが送信したデータをサーバが一度うけとり、全クライアントに送信しなおす。
      この方法では送信に時間がかかる場合もあるが、全てのクライアントで同期が取れる。
var IsServer : Boolean; // 起動モードフラグ。True=サーバ、False=クライアント。

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  i   : Integer;
begin
  if Key = #13 then // Enterキーが押された場合
  begin
    if IsServer then // サーバモードなら、
    begin
      Memo1.Lines.Add(Edit1.Text);  // 自身のメッセージを表示
      for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
        ServerSocket1.Socket.Connections[i].SendText(Edit1.Text); // 全クライアントに送信
    end
    else                     // クライアントモードならば
      ClientSocket.Socket.SendText(str); // サーバにメッセージ送信

    Edit1.Text := ''; // 送信したメッセージは消去
  end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket); // クライアントモードでメッセージを受信した場合
begin
  Memo1.Lines.Add(Socket.ReceiveText); // サーバから受信したメッセージを表示
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket); // サーバモードでメッセージを受信した場合
var
  str : String;
  i   : Integer;
begin
  str := Socket.ReceiveText;
  Memo1.Lines.Add(str); // クライアントから受信したメッセージを表示

  for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do // 受信メッセージを
    ServerSocket1.Socket.Connections[i].SendText(str); // 全クライアントに送信
end;