13,009
回編集
| 29行目: | 29行目: | ||
<br><br> | <br><br> | ||
== クライアント | |||
== クライアント == | |||
==== 送信 ==== | |||
以下の例では、TcpClientクラスを使用して、非同期でサーバに接続およびメッセージを送信している。<br> | 以下の例では、TcpClientクラスを使用して、非同期でサーバに接続およびメッセージを送信している。<br> | ||
また、タイムアウトが発生した場合の再試行処理や高度なエラー処理等も追加することを推奨する。<br> | また、タイムアウトが発生した場合の再試行処理や高度なエラー処理等も追加することを推奨する。<br> | ||
| 87行目: | 89行目: | ||
} | } | ||
catch (SocketException e) | catch (SocketException e) | ||
{ // ネットワーク関連のエラーが発生した場合 | |||
Console.WriteLine($"SocketException: {e.Message}"); | |||
} | |||
catch (TimeoutException e) | |||
{ // タイムアウトが発生した場合 | |||
Console.WriteLine($"TimeoutException: {e.Message}"); | |||
} | |||
catch (Exception e) | |||
{ // その他の予期せぬエラーが発生した場合 | |||
Console.WriteLine($"予期せぬエラーが発生: {e.Message}"); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 受信 ==== | |||
以下の例では、TcpClientクラスを使用して、非同期でサーバに接続およびメッセージを受信している。<br> | |||
また、タイムアウトが発生した場合の再試行処理や高度なエラー処理等も追加することを推奨する。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.Text; | |||
using System.IO; | |||
using System.Threading.Tasks; | |||
using System.Net.Sockets; | |||
class AsyncTcpClientReceiver | |||
{ | |||
static async Task Main(string[] args) | |||
{ | |||
string server = "<ホスト名またはIPアドレス>"; // サーバーのアドレス | |||
int port = <ポート番号>; // ポート番号 | |||
int timeoutMilliseconds = 5000; // タイムアウト(ミリ秒) | |||
try | |||
{ | { | ||
using (TcpClient client = new TcpClient()) | |||
{ | |||
// サーバへ接続 | |||
var connectTask = client.ConnectAsync(server, port); | |||
// サーバへの接続が確立するまで待機 | |||
if (await Task.WhenAny(connectTask, Task.Delay(timeoutMilliseconds)) != connectTask) | |||
{ // タイムアウトが発生した場合 | |||
throw new TimeoutException("エラー: サーバへの接続がタイムアウト"); | |||
} | |||
using (NetworkStream stream = client.GetStream()) | |||
{ // サーバへメッセージを送信 | |||
byte[] data = new byte[256]; | |||
var readTask = stream.ReadAsync(data, 0, data.Length); | |||
if (await Task.WhenAny(readTask, Task.Delay(timeoutMilliseconds)) != readTask) | |||
{ | |||
throw new TimeoutException("エラー: メッセージの受信がタイムアウト"); | |||
} | |||
int bytes = await readTask; | |||
string responseData = Encoding.UTF8.GetString(data, 0, bytes); | |||
Console.WriteLine($"受信メッセージ: {responseData}"); | |||
} | |||
} | |||
} | |||
catch (ArgumentNullException e) | |||
{ // 無効な引数が渡された場合 | |||
Console.WriteLine($"ArgumentNullException: {e.Message}"); | |||
} | |||
catch (SocketException e) | |||
{ // ネットワーク関連のエラーが発生した場合 | |||
Console.WriteLine($"SocketException: {e.Message}"); | Console.WriteLine($"SocketException: {e.Message}"); | ||
} | |||
catch (IOException e) | |||
{ // ストリームの読み書き中にエラーが発生した場合 | |||
Console.WriteLine($"IOException: {e.Message}"); | |||
} | } | ||
catch (TimeoutException e) | catch (TimeoutException e) | ||
{ | { // タイムアウトが発生した場合 | ||
Console.WriteLine($"TimeoutException: {e.Message}"); | Console.WriteLine($"TimeoutException: {e.Message}"); | ||
} | } | ||
catch (Exception e) | catch (Exception e) | ||
{ | { // その他の予期せぬエラーが発生した場合 | ||
Console.WriteLine($"予期せぬエラーが発生: {e.Message}"); | Console.WriteLine($"予期せぬエラーが発生: {e.Message}"); | ||
} | } | ||