C#は、TCPソケットプログラミングに取り入れる簡単な方法ですか?

私はデータベースを使って小さなメッセージをあるPCから別のPCに送るプログラムに取り組んだ。私がやったことは、共有フォルダにデータベースを置いて、他のPC上のプログラムをパス(それ以下ではない)に接続させ、そこにメッセージを簡単かつ簡単にPCに送ることですネットワーク上で最高の選択肢ではありませんが、それは単なる宿題であり、迅速で汚いアプローチは私にグレードを与えました。

しかし今では宿題が終わったので、私がしたことを改善したいと思います。プログラムの問題は展開段階にあります。共有フォルダー上のデータベースへの直接のパスに関するフォルダ/インストールパスと管理/共有の問題が多すぎます。

だから、ここのstackoverflowの良い人達は私にソケットプログラミングを試してみるように勧めました。私はこれが私のリーグからちょっと外れていると思います。しかし、あなたは決して知りません...

また、私は同期と非同期のソケットプログラミングの違いについて認識しています。 1ブロック、もう1ブロックはありません。私が取り組んでいるプログラムはシンプルなターンベースのゲームなので、同期は十分に良いと思っていました。それはあなたのターンでなければ本当に何もできないからです。しかし問題は、プログラムが「応答していない」と扱われていることです。私は非同期を試みましたが、スレッディングに関する問題に遭遇しました。

論理的には、プログラムは単純です。 1つのホスト、1つのクライアント。クライアント接続時に、ホストはデータを送信します。その後、クライアントは自分のデータを受信して​​送信します。 1人のプレイヤーが敗北するまで、そうする。

私の学校に.NET 2.0しかインストールされていないと申し訳ありません。 WCFなど何もありません。また、C#のWindowsフォームで行う必要がありますので、XNAは出力されています。

だから、私は質問したいと思います...ソケットプログラミングに入る簡単な方法はありますか?助けることができるすべてのガイド/サンプルプロジェクト?研究され、適応される既製のコード?

私が見つけて適応させたサンプルの大部分は、私が十分に考えていたチャットアプリケーションですが、それをモジュール化するだけで簡単に破棄されます。

7
もう少し "狂った"方法でそれを行う方法を学ぶために戻ってくる+1!
追加された 著者 spender,
うんそれがおれだった ;)
追加された 著者 spender,
はい、まあ、私の以前の質問に対する最初の返答は、「あなたがやっていることは気違いです!
追加された 著者 zack_falcon,
考慮する可能性のある別のオプションがあります。ノンブロッキングソケットは、現在のスレッドで受信データをポーリングできるようにします。それはパフォーマンスのわずかなビットがかかるかもしれませんが、私はプレーヤーが気づくだろうとは思っていません。
追加された 著者 C.Evenhuis,
あなたがスレッドチェックアウトの複雑さに苦労しているなら、BackgroundWorkerクラス msdn .microsoft.com/ja-us/library /… これにより、やや単純化されます
追加された 著者 Ben Robinson,
あなたの学校の.NET 2.0だけ?そこに何があるのか​​について生徒を準備していない学校を見ているのは嫌です....
追加された 著者 Polity,

4 答え

あなたが遭遇したチャットアプリケーションの例で十分です。あなたが「モジュール化する」と言っていることは私には分かりません。

What you need is to design a protocol to be sent over the connection, an agreement of rules so to say, so that one knows what the other is talking about. So instead of sending plain text (chat) you can send the following:

0x03 (length of the message)
0x0A (move command in this fictional protocol)
0x02 (parameter 1 of the command, X coordinate in this case, it's all defined in the protocol design)
0x05 (parameter 2 of the command, Y coordinate in this case, it's all defined in the protocol design)

データを受け取って解釈した後には、それはあなた次第です。個人的には、Asyncソリューションのために行くでしょう。なぜなら、あなたのプログラムは他のもの(グラフィックス?)を実行するからです。そして、私の経験では、コードにもっと簡単に適応できます。

1
追加された
したがって、メッセージを受け取った時点で制御する必要があります。これは、MessageクラスのQueueを実装することで実行できます。Messageには、コールバックであなたが解釈したデータが含まれています。コールバックごとに、受信メッセージを解析してキューに入れます。その後、メッセージが受信されたかどうかを調べる時間が来たら、キュー内でメッセージを検索するだけです。
追加された 著者 loconero,
申し訳ありませんが、私は 'モジュール'の部分をクリアしませんでした。私はそれが長すぎると思った。私が調査して適応させたチャット・アプリケーションは、Asyncを使用しています。それは分かります。それは比較的簡単です。しかし、私のプログラムは、文字列を受け取った後、送信する前にいくつかの関数を呼び出し、受け取った文字列に基づいてGUIの変更を適用する関数と、GUI上で押されたものに基づいて送信する文字列を変更します。それは、プログラム(主にスレッド化)が失敗するところです。
追加された 著者 zack_falcon,

I remember when I started with socket communication in C# I tried to implement a simple chat program between a client and a server and then between multiple clients. Here is the tutorial that I was reading then: http://www.codeproject.com/KB/IP/TCPIPChat.aspx

完全なコードが必要な場合は、最終プロジェクトをアップロードしてコードを勉強することができます。また、マルチスレッドを使用するので、GUIアプリケーションでこのような状況を処理する方法を理解することができます。

サイドノート:うわー、そのデータベースのアイデアは、私がPCからPCへのコミュニケーションの面で見た最も魅力的なものです。よくやった!

0
追加された
また、チャットアプリケーションでしたが、複数のクライアント間でメッセージをルーティングするサーバーがあります。
追加された 著者 Tudor,
私のチャットアプリケーションにも私のプログラムが基づいていましたが、私の成功はかなり限られていました。あなたはどんなプロジェクトをしていましたか?
追加された 著者 zack_falcon,

私は、 BinaryFormatter を使ってソケット上でオブジェクトを移送するために使用できるいくつかのクラスを作った。

私の BinaryTransport クラスのいくつかのテストは次のとおりです:

http://fadd.codeplex.com/SourceControl/changeset/view/67972#1055425

実際のクラス:

http://fadd.codeplex.com/SourceControl/changeset/view/67972#1054822

私はそれらを書いたのはもう少し前です。私は小さなバグに気付いた。しかし、それらを使うか、もっと学ぶためにクラスを勉強するだけです。

0
追加された

ソケットについて学ぶためにできる面白い、便利で簡単な練​​習(C#はそれをより簡単にします)は、TCPベースのロガーを作成することでした。

開発時には、プログラマーはある時点で何が起こっているのかを知る方法が必要です。ロガーがなければ、通常次のようなコードを書くでしょう:

Console.WriteLine( "blah" );

フィルタリングされていない未整理の文字列が出力ウィンドウにスローされます。

ソケットを使ってTCPベースのロガーを作成しました。一方では、着信メッセージをリッスンし、リッチコンテンツコントロール上に美しく表示することを担当する別個のWinformsアプリケーション(サーバー)があります。一方、次のような単一の関数を持つ非常に単純なクラス(クライアント)を作成します。

public static class MyConsole
{
    public static void WriteLine( string message, string whatever )
    {
       //send to the net
        if( mTcpSocket.Connected )
            mTcpSocket.Send( message );

       //in case the server is not there we still have regular output
        Console.WriteLine( message );
    }
}

私はこのロガーを一度作って以来ずっと使ってきました。さらに、tcpの性質上、サーバー側のマイナーチェンジでは、C#とJavaのように異なる言語からの使用に成功し、現在はActionScriptから使用しています。

0
追加された