Delphi LANでチャット

解決


tanahashi  2022-09-26 02:42:03  No: 150492  IP: 192.*.*.*

2台のPCをLANケーブル(クロス)でつないで
お互いにチャットをやり取りするソフトを作りたいです。
例えばPC1で「あああ」っておくるとPC2で「あああ」って表示される。
その逆でPC2で「いいい」っておくるとPC1で「いいい」って表示される。
そんなプログラム教えてください。

編集 削除
AAAAA  2022-09-26 03:30:05  No: 150495  IP: 192.*.*.*

//Clientから送信
procedure TForm1.Button1Click(Sender: TObject);
begin
    IdTCPClient1.Socket.Write(ByteLength(Edit1.Text));
    IdTCPClient1.Socket.WriteLn(Edit1.Text);
end;

//Server起動
procedure TForm1.Button3Click(Sender: TObject);
var
    Binding: TIdSocketHandle;
begin
    Binding := IdTCPServer1.Bindings.Add;
    Binding.IP   := GStack.LocalAddress; //自身のアドレス
    Binding.Port := 200; //適当
    IdTCPServer1.Active := True;
end;

//Client起動
procedure TForm1.Button4Click(Sender: TObject);
begin
    IdTCPClient1.Host := GStack.LocalAddress;  //相手のアドレス
    IdTCPClient1.Port := 200; //Serverと同じポート
    IdTCPClient1.Connect;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    IdTCPServer1.Active := False;
    IdTCPClient1.Disconnect;
end;

//Server受信
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
    SIZE: Integer;
begin
    SIZE := AContext.Connection.Socket.ReadInt32;
    TEXT := AContext.Connection.Socket.ReadLn;
    Memo1.Lines.Add(TEXT);
end

編集 削除
AAAAA  2022-09-26 03:31:32  No: 150496  IP: 192.*.*.*

    IdTCPClient1.Socket.Write(ByteLength(Edit1.Text));
 と
    SIZE := AContext.Connection.Socket.ReadInt32;
 はいらない

編集 削除
tanahashi  2022-09-28 05:41:03  No: 150532  IP: 192.*.*.*

初歩的な質問ばかりで申し訳ないですが、LocalAddressの部分はどういう記載方法でしょうか?
Binding.IP   := GStack.LocalAddress;     →  Binding.IP   := GStack.192.168.2.10;
IdTCPClient1.Host := GStack.LocalAddress;  → IdTCPClient1.Host := GStack.192.168.2.11;

編集 削除
AAAAA  2022-09-28 05:51:52  No: 150533  IP: 192.*.*.*

   Binding.IP := '192.168.1.1';
  IdTCPClient1.Host := '192.168.1.1';

Binding.IP   := GStack.LocalAddress;    は自身のアドレスを設定しているので
Binding.IP := '192.168.1.1'; のように指定しないでよいです。


編集 削除
AAAAA  2022-09-28 06:08:10  No: 150536  IP: 192.*.*.*

Binding.IP   := GStack.LocalAddress;   は変更必要なし

PC1 (192.168.0.1) で動かすプログラム
 IdTCPClient1.Host := "192.168.0.2"

PC2 (192.168.0.2) で動かすプログラム
 IdTCPClient1.Host := "192.168.0.1"

 IdTCPClient1.Host := GStack.LocalAddress;  //相手のアドレス
でも1個のPCで2個起動すれば送信はできるよ? (ClientからServerの送信)
サーバー2個立てられないので(ポート変えればできるけど)相互通信にはならないけど

編集 削除
tanahashi  2022-10-03 02:19:25  No: 150567  IP: 192.*.*.*

基本的なチャット部分は完成しました。
ご教授ありがとうございます。
一点日本語(ひらがな漢字)を送ると????になってしまいます。
IdTCPClient1.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;
を使ってみましたがうまくいきませんでいた。

編集 削除
AAAAA  2022-10-03 03:00:40  No: 150568  IP: 192.*.*.*

送信
    IdTCPClient1.Socket.WriteLn(Edit1.Text,IndyTextEncoding_UTF8);

受信
    Memo1.Lines.Add(AContext.Connection.Socket.ReadLn(IndyTextEncoding_UTF8));

編集 削除
tanahashi  2022-10-04 05:52:32  No: 150574  IP: 192.*.*.*

できました
ありがとうございました

編集 削除