TcpClientクラスを使用してソケットクライアントを実装しました。だから私はデータを送受信することができ、すべてがうまくいく。しかし、私はいくつかの教祖をそこに尋ねます:)私の実装に何か問題はありますか?おそらく、より良いやり方があります。特に、私はどのように切断するのですか?ソケットが接続されていないことを示すインジケータがありますか?TcpClientクラスを使用した非同期ソケットクライアントC#
私はSocketクラスの機能を待っていますが、 "SocketAsyncEventArgs"の周りに私の頭を包むことはできません。どうしてそちらが最初ですか? なぜ私はちょうど:待っているClient.SendAsync( "データ");?
public class Client
{
private TcpClient tcpClient;
public void Initialize(string ip, int port)
{
try
{
tcpClient = new TcpClient(ip, port);
if (tcpClient.Connected)
Console.WriteLine("Connected to: {0}:{1}", ip, port);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Initialize(ip, port);
}
}
public void BeginRead()
{
var buffer = new byte[4096];
var ns = tcpClient.GetStream();
ns.BeginRead(buffer, 0, buffer.Length, EndRead, buffer);
}
public void EndRead(IAsyncResult result)
{
var buffer = (byte[])result.AsyncState;
var ns = tcpClient.GetStream();
var bytesAvailable = ns.EndRead(result);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesAvailable));
BeginRead();
}
public void BeginSend(string xml)
{
var bytes = Encoding.ASCII.GetBytes(xml);
var ns = tcpClient.GetStream();
ns.BeginWrite(bytes, 0, bytes.Length, EndSend, bytes);
}
public void EndSend(IAsyncResult result)
{
var bytes = (byte[])result.AsyncState;
Console.WriteLine("Sent {0} bytes to server.", bytes.Length);
Console.WriteLine("Sent: {0}", Encoding.ASCII.GetString(bytes));
}
}
と使用方法:
static void Main(string[] args)
{
var client = new Client();
client.Initialize("127.0.0.1", 8778);
client.BeginRead();
client.BeginSend("<Names><Name>John</Name></Names>");
Console.ReadLine();
}
'if(bytesRead == 0)return; 「私には間違っているようだ? – Sir
いいです。 'NetworkStream.ReadAsync'は、ストリームがリモート側からクローズされたときに0を返します。 しかし、アプリケーションによっては、ここで例外を返すのではなく、ここで例外をスローする方が意味があります。これはほんの一例でした。 私の例で 'ReadAsync'の前に' await'が見つからなかったようです。私はそれを修正した。 – Matthias247
リモート側からクローズドとはどういう意味ですか?それは、送信されたメッセージが完了した/ EOFに達したときとどのように比較されますか。しかし、今後もさらにメッセージが出る可能性があります。 現時点で問題を解決するために苦労しているのは、閉じられない接続でストリームから受信メッセージを読み続ける方法です。 MS docsには、永続的な接続の例はほとんどありません。読んだ直後に閉じます。 – Sir