Ren*_*sen 5 c# sockets sleep tcpclient
当我试图避免使用Thread.sleep(400)
我的代码时遇到问题,如下所示:
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket = Connect(IP, Port);
Thread.Sleep(400);
NetworkStream networkStream = clientSocket.GetStream();
Send(networkStream, "My Data To send");
networkStream.Flush();
Run Code Online (Sandbox Code Playgroud)
和我的 send() 方法:
public static void Send(NetworkStream networkStream, string Data)
{
int range = 1000;
int datalength = 0;
foreach (string data in Enumerable.Range(0, Data.Length / range).Select(i => Data.Substring(i * range, range)))
{
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(data);
networkStream.Write(outStream, 0, outStream.Length);
datalength = datalength + range;
Thread.Sleep(50);
}
byte[] LastoutStream = System.Text.Encoding.ASCII.GetBytes(Data.Substring(datalength, Data.Length - datalength) + "$EOS$\r\n");
networkStream.Write(LastoutStream, 0, LastoutStream.Length);
}
Run Code Online (Sandbox Code Playgroud)
连接方法:
protected static System.Net.Sockets.TcpClient Connect(string Ip, int Onport)
{
//start connection
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
try
{
clientSocket.Connect(Ip, Onport);
}
catch
{
clientSocket.Connect("LocalHost", Onport);
}
return clientSocket;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法检查流是否准备好使用?
尽管您的代码正在运行,但我想指出有关流的这些内容
GetStream()仅在两种情况下返回异常,这些异常是(来源):
InvalidOperationException - TcpClient 未连接到远程主机。
ObjectDisposeException - TcpClient 已关闭。
因此,如果您满足这两个条件,您的流应该可用
出于与对方代码中存在错误相同的原因,在代码中编写异常逻辑总是好的。
在您自己的connect()方法中,您应该找出异常并通知被调用函数连接不成功,或者将异常抛出回调用方函数并使用 try catch 来处理它。因此,在成功的情况下,您将始终获得流媒体。
try{
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket = Connect(IP, Port);
//Thread.Sleep(400);
NetworkStream networkStream = clientSocket.GetStream();
Send(networkStream, "My Data To send");
networkStream.Flush();
}catch(Exception E)
{
//Log
//Its always best to catch the actual exception than general exception
//Handle gracefully
}
Run Code Online (Sandbox Code Playgroud)
Connect 方法,或者您可以忽略异常以回退到调用者
protected static System.Net.Sockets.TcpClient Connect(string Ip, int Onport)
{
//start connection
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
try
{
clientSocket.Connect(Ip, Onport);
}
catch
{
//clientSocket.Connect("LocalHost", Onport);
throw;
}
return clientSocket;
}
Run Code Online (Sandbox Code Playgroud)