ホームページ  >  記事  >  Java  >  C# (ソケット) 非同期ソケットのコード例

C# (ソケット) 非同期ソケットのコード例

黄舟
黄舟オリジナル
2016-12-22 13:29:341493ブラウズ

非同期クライアント ソケットの例


次のサンプル プログラムは、サーバーに接続するクライアントを作成します。クライアントは非同期ソケットを使用して構築されているため、サーバーからの応答を待っている間にクライアント アプリケーションの実行が中断されることはありません。アプリケーションは文字列をサーバーに送信し、サーバーから返された文字列をコンソールに表示します。

C# using System;
using System.Net.Sockets;
using System.Text;
public class StateObject {
// クライアントソケット。
public Socket = null;
public const BufferSize = 256;
public byte[] バッファ = new byte[BufferSize]; // 受信したデータ文字列
public StringBuilder sb = new StringBuilder();
public class AsynchronousClient {
// リモート デバイスのポート番号
private const int port = 11000
// ManualResetEvent シグナル完了
private static ManualResetEvent connectDone =
new ManualResetEvent(false);
private static ManualResetEvent(false);
private static ManualResetEvent acceptDone =
new ManualResetEvent(false) ;
private static String response = String.Empty;
private static void StartClient() {
// リモート デバイスに接続します。
try {
// ソケットの名前。 / リモート デバイスは "host.contoso.com" です。
IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList[0]; ) ;
// TCP/IP ソケットを作成します。
Socket client = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
client.BeginConnect(remoteEP,
); new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();
Send(client,"This is a test");
// リモートデバイスから応答を受信します。
receiveDone.WaitOne();
Console.WriteLine("応答を受け取りました: {0}", response) ;
//ソケットを解放します。
client.Shutdown();
Console.WriteLine(e.ToString()); private static void ConnectCallback(IAsyncResult ar) {
try {
// 状態オブジェクトからソケットを取得します。
client = (Socket) ar.AsyncState;
client.EndConnect(ar); Console .WriteLine("ソケットが {0} に接続されました",
client.RemoteEndPoint.ToString());
connectDone.Set()
} catch (Exception e);
Console .WriteLine(e.ToString());
}
}
private static void Receive(Socket client) {
try {
// 状態オブジェクトを作成します。 state = new StateObject(); = クライアント
// リモート デバイスからのデータの受信を開始します。client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state); 
} catch (Exception e) {
Console.WriteLine(e.ToString()); 
}
}
private static void ReceiveCallback( IAsyncResult ar ) {
try {
// 非同期 状態 オブジェクトから 状態 オブジェクト と クライアント ソケット
// を取得します。 
StateObject state = (StateObject) ar.AsyncState; 
ソケットクライアント = state.workSocket; 
// リモートデバイスからデータを読み取ります。 
int bytesRead = client.EndReceive(ar); 
if (bytesRead > 0) {
// さらにデータがある可能性があるため、これまでに受信したデータを保存してください。 
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); 
// 残りの データを取得します。 
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
new AsyncCallback(ReceiveCallback), state); 
} else {
// すべての データ が到着しました。 それを応答に入れます。 
if (state.sb.Length > 1) {
response = state.sb.ToString(); 
}
// すべてのバイトが受信されたことを知らせます。 
receiveDone.Set(); 
}
} catch (Exception e) {
Console.WriteLine(e.ToString()); 
}
}
private static void Send(Socket client, String data) {
// ASCII エンコーディングを使用して、文字列データをバイトデータに変換します。 
byte[] byteData = Encoding.ASCII.GetBytes(data); 
// リモート デバイスへのデータの送信を開始します。 
client.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), client); 
}
private static void SendCallback(IAsyncResult ar) {
try {
// 状態オブジェクトからソケットを取得します。 
ソケットクライアント = (ソケット) ar.AsyncState; 
// リモートデバイスへのデータの送信を完了します。 
int bytesSent = client.EndSend(ar); 
Console.WriteLine("サーバーに {0} バイトを送信しました。", bytesSent); 
// すべてのバイトが送信されたことを知らせます。 
sendDone.Set(); 
} catch (Exception e) {
Console.WriteLine(e.ToString()); 
}
}
public static int Main(String[] args) {
StartClient(); 
0を返す; 
}
}
パケット サーバー パケットの例 以下の例示的なプログラムは、クライアントからの接続要求を受信するサーバーを作成します。接続時不起動サーバーアプリケーションプログラムは、クライアント端末から文字列を受信し、制御台でその文字列を表示し、その後、その文字列をクライアントに返す。 ,
メッセージ ログを表示する信号を発行します。








C#
复制番号

using System; 
System.Net を使用する; 
System.Net.Sockets を使用する; 
System.Text を使用します。 
System.Threading を使用します。 
// クライアント データを非同期的に読み取るための状態オブジェクト
public class StateObject {
// Client socket。 
public Socket workSocket = null; 
// 受信バッファのサイズ。 
public const int BufferSize = 1024; 
// バッファを受信します。 
public byte[] buffer = new byte[BufferSize]; 
// 受信したデータ文字列。 
public StringBuilder sb = new StringBuilder(); 
}
パブリック クラス AsynchronousSocketListener {
// スレッド シグナル。 
public static ManualResetEvent allDone = new ManualResetEvent(false); 
public AsynchronousSocketListener() {
}
public static void StartListening() {
// 受信データ用のデータバッファ。 
byte[] バイト = 新しい バイト[1024]; 
// ソケットのローカルエンドポイントを確立します。 
// リスナーを実行しているコンピューターの DNS 名
// は「host.contoso.com」です。 
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
IPAddress ipAddress = ipHostInfo.AddressList[0]; 
IPEndPoint localEndPoint = 新しい IPEndPoint(ipAddress, 11000); 
// TCP/IP ソケットを作成します。 
ソケットリスナー = 新しいソケット(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp); 
// ソケットをローカル エンドポイントにバインドし、受信接続をリッスンします。 
試してください {
listener.Bind(localEndPoint); 
listener.Listen(100); 
while (true) {
// イベントを非シグナル状態に設定します。 
allDone.Reset(); 
// 接続をリッスンするために非同期ソケットを開始します。 
Console.WriteLine("接続を待機しています..."); 
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener ); 
// 続行する前に、接続が確立されるまで待ちます。 
allDone.WaitOne(); 
}
} catch (Exception e) {
Console.WriteLine(e.ToString()); 
}
Console.WriteLine("n続行するには Enter を押してください..."); 
Console.Read(); 
}
public static void AcceptCallback(IAsyncResult ar) {
// メインスレッドに継続するよう信号を送ります。 
allDone.Set(); 
// クライアントリクエストを処理するソケットを取得します。 
ソケットリスナー = (ソケット) ar.AsyncState; 
ソケットハンドラー=listener.EndAccept(ar); 
// 状態オブジェクトを作成します。 
StateObject state = new StateObject(); 
state.workSocket = ハンドラー; 
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state); 
}
public static void ReadCallback(IAsyncResult ar) {
String content = String.Empty; 
// 状態オブジェクトとハンドラーソケットを取得します
// 非同期状態オブジェクトから。 
StateObject state = (StateObject) ar.AsyncState; 
ソケットハンドラー = state.workSocket; 
// クライアントソケットからデータを読み取ります。  
int bytesRead = handler.EndReceive(ar); 
if (bytesRead > 0) {
// さらにデータがある可能性があるため、これまでに受信したデータを保存します。 
state.sb.Append(Encoding.ASCII.GetString(
state.buffer,0,bytesRead)); 
// ファイルの終わりタグを確認します。 そこにない場合は、
//その他のデータを読んでください。 
content = state.sb.ToString(); 
if (content.IndexOf("") > -1) {
// すべてのデータ は
// クライアントから 読み取られています。 それをコンソールに表示します。 
Console.WriteLine("ソケットから {0} バイトを読み取ります。n データ: {1}",
content.Length, コンテンツ); 
// データをクライアントにエコーバックします。 
Send(ハンドラー, コンテンツ); 
} else {
// すべてのデータを受信したわけではありません。 多くを得る。 
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state); 
}
}
}
private static void Send(Socket handler, String data) {
// ASCII エンコーディングを使用して、文字列データをバイトデータに変換します。 
byte[] byteData = Encoding.ASCII.GetBytes(data);
// リモート デバイスへのデータの送信を開始します。
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler) ;
}
private static void SendCallback(IAsyncResult ar) {
try {
// 状態オブジェクトからソケットを取得します。
Socket handler = (Socket) ar.AsyncState;
// リモート デバイスへのデータの送信を完了します。
int bytesSent = handler.EndSend(ar);
Console.WriteLine("クライアントに {0} バイトを送信しました。", bytesSent);
handler.Close(); (例外 e) {
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args) {
return
}
}

以上ですC# (ソケット) 非同期ソケット コードのサンプル コンテンツ。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。