喫茶XRAYトップページ

[▲前のスレッド]

[6290] TServerSocketの使用方法について返信 削除
2012/8/24 (金) 14:52:17 boo
2008年に「プリンタ設定ダイアログの設定内容の保存と読出し」の投稿をしましたbooと申します。
その節は大変お世話になりました。現在も問題なく動作しております有難うございました。

今回はTServerSocketの使い方で自己解決できず悩んでおります。以下はご相談内容となります。


クライアントからTClientSocketで送信された文字を、サーバのTServerSocketがClientReadイベント内で文字を受信してます。
以下がサーバが文字を受信してるロジックとなります。
(組み方がわからなかったため、Webで調べたところ配列を使用した方法が多かったので参考としました。)

procedure From1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

//受信数を取得
cnt := ServerSocket1.Socket.ActiveConnections;

//受信数のループ
for i := 0 to cnt-1 do
begin
  //受信文字取得
  workstr := ServerSocket1.Socket.Connections[cnt].ReceiveText;

  //受信文字の内容によって、モロモロの処理
 ・モ
 ・ロ
 ・モ
 ・ロ
end;

この方法は1対1の通信は問題なく動作しますが、複数クライアントから同時に文字を送信すると
1回目のループは正しく文字を取得しましたが、2回目のループで文字が取得できませんでした。

そこでClientReadイベントの引数Socket:TCustomWinSocketを使用する方法に組み替えたところ
複数同時接続も正常に動作することを確認できました。

procedure From1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

  //受信文字取得
  workstr := Socket.ReceiveText;

  //受信文字の内容によって、モロモロの処理
 ・モ
 ・ロ
 ・モ
 ・ロ
end;

前置きが長くなりましたが、以下がご相談したい内容となります。
私の環境では配列情報が読み取れない場合があったため、ClientReadイベントの引数を使用しましたが
Web上では配列を使用する情報が多いため、自分の結果に不安を感じています。
配列でも上手く動作するものなのでしょうか?
それとも私の結果のように同時接続の場合を考慮する場合は、配列は使うべきではないのでしょうか?


以上。宜しくお願いします。


[6293] Re:TServerSocketの使用方法について返信 削除
2012/8/24 (金) 17:27:32 Mr.XRAY
▼ booさん,どうもです.暑い日が続いていますね.

で,おたずねの内容ですが,う〜む.

>複数クライアントから同時に文字を送信すると
>1回目のループは正しく文字を取得しましたが、


受信の際に,クライアントの判別っていうのはどうなんでしょう?
ここは無理をせず,どなかたにバトンタッチします(笑)

お〜い,そこのお客さーん.

[6295] Re2:TServerSocketの使用方法について返信 削除
2012/8/24 (金) 19:27:02 boo
お返事有難うございます。ビールが美味しい季節ですね!


クライアント判別についてですが、情報が不足しており申し訳ございません。
実はRemoteaddressで接続クライアントのIPを取得しております。
具体的なループの値ですが、以下のようになります。

クライアントA IP:AA.AA.AA.AA、送信文字:1
クライアントB IP:BB.BB.BB.BB、送信文字:2

1回目のループ
ReciveText:1
RemoteAddress:AA.AA.AA.AA

2回目のループ
ReciveText:(空)
RemoteAddress:AA.AA.AA.AA

という結果となりました。

想像になりますが、配列の内容は接続状況により内容が変化すると思います。
その変化する値をClientReadイベント内で使用してます。
これもお伝えしてない情報ですが、ループ処理内のモロモロの処理は時間がかかる処理になってます。
1回目のループでは正しく取得できたが、2回目のループの時には配列情報が変わっており
有効でないゴミデータみたいなものを参照しているのでは?と考えたりしましたが如何でしょうか?



[6296] Re3:TServerSocketの使用方法について返信 削除
2012/8/25 (土) 14:15:22 Mr.XRAY
▼ booさん

あまり経験のない分野なので...
昔,Soket を使用して,クライアント間のメッセンジャーみたいのは
作ったことがあります.遊びですが.

> 有効でないゴミデータみたいなものを参照しているのでは?

データを格納する変数(配列?)の初期化かなんかなんでょうか?
レスがないようでしたら,MLとかで訊いた方がいいかも知れません.

以下は,booさんへのレスではなく,関係するということで,
この掲示板をご覧になっている方への参考記事です.
この方面に少し興味があって,経験のない方向きです.
やってみると,ちょっとは面白いかも... (^^;

http://ext-web.edu.sgu.ac.jp/HIKO/Delphi01/chap_d/pb_d01.html

[6298] Re4:TServerSocketの使用方法について返信 削除
2012/8/26 (日) 10:14:06 snail3
> ▼ booさん

十年以上前、ソケット利用するプログラムを依頼してことがあります。
「できた」といって持ってきたプログラムは単独では動作するけど
負荷をかけるとボロボロ。再送などの処理を自分で組む必要が
あったように覚えています。



[6299] Re5:TServerSocketの使用方法について返信 削除
2012/8/26 (日) 18:01:31 Mr.XRAY
▼ snail3さん

> 負荷をかけるとボロボロ。再送などの処理を自分で組む必要が
> あったように覚えています。


う〜ん,難しいんでしょうか ?

[6302] Re6:TServerSocketの使用方法について返信 削除
2012/8/28 (火) 10:35:41 boo
Mr.XRAY様、snail3様

お返事ありがとうございます。
サイトもご紹介いただきありがとうございます。


snail3さんの仰る現象と同じで、単独ではまったく問題ないんですよね。
配列を使わない方法で思うように動いてくれているので、しばらく様子を見ます。


一人で悩んでおりましたので、皆様のお話が聞けただけで胸のモヤモヤが少し晴れました。
お付き合い頂き有難うございました。


[6303] Re7:TServerSocketの使用方法について返信 削除
2012/8/28 (火) 16:12:23 Mr.XRAY
▼ booさん

スミマセンね.お役に立たなくて.
健闘を祈っています.

[6304] Re7:TServerSocketの使用方法について返信 削除
2012/8/28 (火) 16:39:16 福士
横から失礼します。

TServerSocket(dclsocketsXXX.bpl)を使う場合の注意事項を補足します。

1.booさんの最初の書き込みのとおり、TServerSocketおよびTClinetSocketで
送受信を行うときはコンポーネントではなくイベントハンドラの引数で
渡されるSocket(TCustomWinSocket)を使う。これはそもそもそういうもの
だったはずです(ヘルプに明記されていたはず)。

2.いまどきのマルチプロセッサ環境ではなるべくIndy(TIdTCPServer)を使う。
これは公式に聞いた話ではなくまた聞きなのですが、Borland(当時)の
有償サポートに問い合わせたところTServerSocketはSMP環境では
正常に動作しないことがあり、そのため最近のDelphiでは標準で
IDEに組み込まれていないのだ、という話でした。
なおTIdTCPServerのOnExecuteイベントはUIとは別のスレッドで呼び出されるので
UI操作をするときはTThread.Synchronizeを使う必要があります(先日これに
はまった)。

[6305] Re8:TServerSocketの使用方法について返信 削除
2012/8/28 (火) 17:58:48 Mr.XRAY
▼ 福士さん,どうもです.

場末の喫茶店にご来店ありがとうございます.

> 横から失礼します。

失礼していただき感謝です.
この方面はほとんど無知ですので助かります.

[6306] Re8:TServerSocketの使用方法について返信 削除
2012/8/29 (水) 11:29:03 boo
福士様

TServerSocketの情報ありがとうございます。

SMP環境で正常動作しない問題を把握しておりませんでした。
TIdTCPServerを使用する方向で検討します。
ありがとうございました。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82