2

非常に幅広い質問で申し訳ありませんが、私は答えが欲しいです。

あるアイデアとして、あるコンピューターでローカルネットワーク上のサーバーを起動し、データを交換するために別のコンピューターをこのサーバーに接続してもらいたいと考えています。

私の質問はこれをどのように行うかです。

追加の質問として、誰かがSystem.netクラスリファレンスに関する優れたチュートリアルを持っていますか?

4

2 に答える 2

2

解決策の 1 つは、ソケットを使用することです。サーバー ソケットの場合は、ソケットを作成してから、bind、listen、accept を呼び出します。これは、非同期的に、または単にスレッドをブロックすることによって実現できます。

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, port));
server.Listen(3);
Socket client = server.Accept();

次に、client接続されたコンピュータへの接続です。これで、Send メソッドを使用して、2 つの間で実際にデータを送信できるようになりました。

string message = "hello there";
byte[] bytes = Encoding.UTF8.GetBytes(message);
byte[] lengthBytes = BitConverter.GetBytes(bytes.Length);
client.Send(lengthBytes);
client.Send(bytes);

lengthbytes が使用されるのは、他のクライアントが「完全なメッセージ」のために転送しているバイト数を知らない可能性があるためです。

一方、クライアントは Connect メソッドを使用して実行中のサーバーに接続し、Recive メソッドを使用してサーバーから送信されたバイトを取得します。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
byte[] lengthBytes = new byte[4];
socket.Receive(lengthBytes);
int length = BitConverter.GetInt32(lengthBytes);
byte[] messageBytes = new byte[length];
socket.Receive(messageBytes);
string message = Encoding.UTF8.GetString(messageBytes);
Console.WriteLine(message);

ちなみに、送信と受信は両方の方法で機能します。

ただし、これは表面をなぞっただけです。これを超える多くのリソースが世の中に出回っていますが、おそらくこれはあなたにとって足がかりになるでしょう. SocketAsyncEventArgsたとえば、Receive を呼び出すときにスレッドをブロックする代わりに、非同期通信に使用されるクラスを調べることができます。

また、ユーザー提供データのサニテーションについても検討する必要があります。「長さ」は、定義したばかりのプロトコルにあるため、ユーザーが提供することを忘れないでください。サーバーに常に正しいデータを送信するように指示することはできません。-1 を送信することもできますnew byte[length]。クライアントがクラッシュしたり、自分のコンピューターで悪いことをしたりしないように、データのサニテーションまたは検証が必要です。

于 2012-10-25T14:42:59.040 に答える
0

このリンクはあなたが始めるべきものだと思います。このテキストは非常に基本的なものですが、どこから始めればよいかわからない場合によくお勧めします。もちろん、サーバーの停止などの問題を処理する必要がありますが、さらに検索する方向が示されます。

于 2012-10-25T14:44:27.150 に答える