我已經實現了一個使用TcpClient類的套接字客戶端。所以我可以發送和接收數據,一切正常。但是我想問一些古魯的問題:)我的實現有什麼問題嗎?也許有更好的做事方式。特別是,我該如何處理斷開連接?有沒有一些指標(或者我可以自己寫一個)告訴我套接字已經斷開連接?使用TcpClient類的異步套接字客戶端C#
我也研究了Socket類的異步等待功能,但無法將我的頭包裹在「SocketAsyncEventArgs」中,爲什麼它首先出現。 爲什麼我不能:等待Client.SendAsync(「data」);?
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文檔沒有長期連接的例子,他們在閱讀後不久就關閉它。 – Sir