不断从 TCP 连接的 StreamReader 中读取,C#
Constant reading from StreamReader from TCP connection, C#
我在 Swift 中有工作脚本,完美地不间断地读取 TCP 连接流。
我需要在 C# 中做同样的事情,在这里我被卡住了。
远程服务是这样工作的:它等待第一个命令,即“*99*1##”,然后它回复“*#*1##”并开始将另一个类似的消息转发到同一个流。我所需要的只是将所有这些服务器答案记录到一个文件中。
问题是我不能得到超过一个服务器的答案。在第一个服务器回答之后,我无法再从流中读取。 Peek()/Read() 方法 return -1,ReadLine return 为空。而且我确定这是错误的,因为从 Swift 脚本我可以看到服务器向我发送的消息远不止一条消息。
首先,这里是Swift代码(阅读流)
let queryString: String = "*99*1##"
let queryData: Data = queryString.data(using: String.Encoding.utf8, allowLossyConversion: false)! as Data
queryData.withUnsafeBytes { outputStream.write([=10=], maxLength: queryData.count) }
var readChars: Int = 0
while true {
readChars = inputStream.read(&buffer, maxLength: buffer.count)
if (readChars > 0) {
let readString: String = NSString(data: NSData(bytes:buffer, length:readChars) as Data, encoding: String.Encoding.utf8.rawValue)! as String
print("\(readString)\n")
} else {
print ("Server closed connection\n")
inputStream.close()
outputStream.close()
break
}
}
通信看起来像这样:
Client->*99*1##
Server->*#*1##
Server->*1*34*#6#4#02##
Server->*1*1*13#4#01##
Server->*1*0*13#4#01##
and etc...
在 C# 中,我尝试了像 ReadLine、Read、ReadToEnd 这样的 StreamReader 方法,其中 none 给了我不止一个服务器答案。
string address = "192.168.0.10";
int port = 20000;
TcpClient client = new TcpClient(address, port);
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
string command = "*99*1##";
Console.WriteLine("Client->" + command);
sw.WriteLine(command);
sw.Flush();
string data;
while (true)
{
data = sr.ReadToEnd();
if (data != null)
{
Console.WriteLine(Server->" + data);
} else
{
break;
}
}
Console.WriteLine("Server closed connection.");
这里的通信看起来完全错误:
Client->*99*1##
Server->*#*1##
Server closed connection
第二个和其他服务器答案在 5 到 10 秒后出现,然后是第一个。也许我这边有一些超时问题?服务器超时大约 30 分钟,我可以通过 Swift 或 Telnet 与它保持会话那么久。
提前感谢您的所有想法。
您应该使用 Read()
而不是 ReadToEnd()
,因为 reader 流持续保持活动状态。所以,像这样尝试;
string address = "127.0.0.1";
int port = 25000;
var client = new TcpClient(address, port);
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
client.
string command = "*99*1##";
Console.WriteLine("Client->" + command);
sw.WriteLine(command);
sw.Flush();
char[] charArray = new char[100];
while (true)
{
var readByteCount = sr.Read(charArray, 0, charArray.Length);
if (readByteCount > 0)
{
var data = new string(charArray, 0, readByteCount);
Console.WriteLine(data + " + data");
}
if (!client.Connected)
{
break;
}
}
Console.WriteLine("Server closed connection.");
我在 Swift 中有工作脚本,完美地不间断地读取 TCP 连接流。 我需要在 C# 中做同样的事情,在这里我被卡住了。 远程服务是这样工作的:它等待第一个命令,即“*99*1##”,然后它回复“*#*1##”并开始将另一个类似的消息转发到同一个流。我所需要的只是将所有这些服务器答案记录到一个文件中。 问题是我不能得到超过一个服务器的答案。在第一个服务器回答之后,我无法再从流中读取。 Peek()/Read() 方法 return -1,ReadLine return 为空。而且我确定这是错误的,因为从 Swift 脚本我可以看到服务器向我发送的消息远不止一条消息。 首先,这里是Swift代码(阅读流)
let queryString: String = "*99*1##"
let queryData: Data = queryString.data(using: String.Encoding.utf8, allowLossyConversion: false)! as Data
queryData.withUnsafeBytes { outputStream.write([=10=], maxLength: queryData.count) }
var readChars: Int = 0
while true {
readChars = inputStream.read(&buffer, maxLength: buffer.count)
if (readChars > 0) {
let readString: String = NSString(data: NSData(bytes:buffer, length:readChars) as Data, encoding: String.Encoding.utf8.rawValue)! as String
print("\(readString)\n")
} else {
print ("Server closed connection\n")
inputStream.close()
outputStream.close()
break
}
}
通信看起来像这样:
Client->*99*1##
Server->*#*1##
Server->*1*34*#6#4#02##
Server->*1*1*13#4#01##
Server->*1*0*13#4#01##
and etc...
在 C# 中,我尝试了像 ReadLine、Read、ReadToEnd 这样的 StreamReader 方法,其中 none 给了我不止一个服务器答案。
string address = "192.168.0.10";
int port = 20000;
TcpClient client = new TcpClient(address, port);
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
string command = "*99*1##";
Console.WriteLine("Client->" + command);
sw.WriteLine(command);
sw.Flush();
string data;
while (true)
{
data = sr.ReadToEnd();
if (data != null)
{
Console.WriteLine(Server->" + data);
} else
{
break;
}
}
Console.WriteLine("Server closed connection.");
这里的通信看起来完全错误:
Client->*99*1##
Server->*#*1##
Server closed connection
第二个和其他服务器答案在 5 到 10 秒后出现,然后是第一个。也许我这边有一些超时问题?服务器超时大约 30 分钟,我可以通过 Swift 或 Telnet 与它保持会话那么久。
提前感谢您的所有想法。
您应该使用 Read()
而不是 ReadToEnd()
,因为 reader 流持续保持活动状态。所以,像这样尝试;
string address = "127.0.0.1";
int port = 25000;
var client = new TcpClient(address, port);
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
client.
string command = "*99*1##";
Console.WriteLine("Client->" + command);
sw.WriteLine(command);
sw.Flush();
char[] charArray = new char[100];
while (true)
{
var readByteCount = sr.Read(charArray, 0, charArray.Length);
if (readByteCount > 0)
{
var data = new string(charArray, 0, readByteCount);
Console.WriteLine(data + " + data");
}
if (!client.Connected)
{
break;
}
}
Console.WriteLine("Server closed connection.");