非同期クライアント ソケットの例
次のサンプル プログラムは、サーバーに接続するクライアントを作成します。クライアントは非同期ソケットを使用して構築されているため、サーバーからの応答を待っている間にクライアント アプリケーションの実行が中断されることはありません。アプリケーションは文字列をサーバーに送信し、サーバーから返された文字列をコンソールに表示します。
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("
// すべてのデータ は
// クライアントから 読み取られています。 それをコンソールに表示します。
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) に注目してください。