从TCP连接,C#持续读取StreamReader

时间:2018-01-19 15:23:53

标签: c# tcp stream connection streamreader

我在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#中,我尝试过ReadReine,Read,ReadToEnd等StreamReader方法,但没有一个方法给我提供多个服务器答案。

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

提前感谢您的所有想法。

1 个答案:

答案 0 :(得分:0)

您应该使用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.");