【问题标题】:Constant reading from StreamReader from TCP connection, C#从 TCP 连接的 StreamReader 持续读取,C#
【发布时间】:2018-06-28 21:15:47
【问题描述】:

我在 Swift 中有工作脚本,可以不间断地完美读取 TCP 连接流。 我需要在 C# 中做同样的事情,在这里我被卡住了。 远程服务的工作方式如下:它等待第一个命令,即“*99*1##”,然后回复“*#*1##”并开始将另一个类似的消息转发到同一流。我需要的只是将所有这些服务器答案记录到一个文件中。 问题是我不能得到超过一个服务器的答案。就在第一个服务器回答之后,我无法再从流中读取。 Peek()/Read() 方法返回 -1,ReadLine 返回 null。而且我确信这是错误的,因为从 Swift 脚本中我可以看到服务器发送给我的信息远不止一条消息。 首先,这里是 Swift 代码(读取流)

    let queryString: String = "*99*1##"
    let queryData: Data = queryString.data(using: String.Encoding.utf8, allowLossyConversion: false)! as Data
    queryData.withUnsafeBytes { outputStream.write($0, 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# 中,我尝试过 StreamReader 方法,例如 ReadLine、Read、ReadToEnd,但它们都没有给我超过一个服务器答案。

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 与它保持很长时间的会话。

提前感谢您的所有想法。

【问题讨论】:

  • ReadToEnd() 显然不会像您所说的那样在流上进行“持续通信”。 Read() 是要走的路,我不知道为什么您无法获得超过 1 个服务器答案。我想在 C# 中阅读有关从 TCP 流中读取的内容?
  • 从 TCP 流中读取是我所做的第一件事:) 尝试过 Read(),尝试按一个字符读取,同样的情况,只有一个答案。从官方来源复制了大量代码,没有任何帮助。当 Swift 正常工作时,我不明白为什么它不能在同一个客户端上工作。也许其他人会指出哪里出了问题

标签: c# tcp stream connection streamreader


【解决方案1】:

您应该使用Read() 而不是ReadToEnd(),因为阅读器流一直保持活动状态。所以,就这样试试吧;

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.");

【讨论】:

  • 我在上面写道,我尝试过 Read、ReadLine 和 ReadToEnd,但都失败了。 Read() 方法通过一个字符给了我相同的单个服务器答案:“*、#、*、1、#、#”。但是让我按照你的代码再试一次。还是谢谢你。
  • 我在 if 条件上犯了一点错误。答案已更新。
  • 在所有这些空字符串中,charArray.Length 为 100,readByteCount 为 0。
  • 一个答案:((((什么鬼....客户端->*99*1##服务器->*#*1##服务器关闭连接。
  • TCP客户端是否有连接超时?我一次又一次地运行我的快速代码,并注意到第二个服务器答案通常在 5 到 10 秒后出现。也许我之前的 C# 代码关闭了连接?
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多