C# Windows 应用程序从流套接字读取数据不可理解

Posted

技术标签:

【中文标题】C# Windows 应用程序从流套接字读取数据不可理解【英文标题】:C# Windows app read data from streamsocket not comprehensible 【发布时间】:2015-03-28 12:39:32 【问题描述】:

我正在尝试实现服务器和客户端之间的简单 StreamSocket 通信。服务器用 Java 编写,客户端用 C# 编写。

从客户端向服务器发送消息(字符串)可以正常工作。但反过来我就有麻烦了。

当我从服务器向客户端发送一个字符串时,我希望每条消息都从客户端打印出来。

我在客户端初始化我的 StreamSocket 如下:

public async void startConn()

   StreamSocket streamSocket = new StreamSocket();
   try
     
       await streamSocket.ConnectAsync(new Windows.Networking.HostName(server), port.ToString());

       DataReader reader = new DataReader(streamSocket.InputStream);
       reader.InputStreamOptions = InputStreamOptions.Partial;
       reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
       var count = await reader.LoadAsync(256);

       while (true)
       
         string text = reader.ReadString(count);           
         Debug.WriteLine("Message: " + text);
         count = await reader.LoadAsync(256);
         
     catch (Exception e)
     
       //TODO
     

我希望客户端打印出来自服务器的每个字符串,即使消息有多长。但是如果我从服务器向客户端发送消息,尽管我将 StreamSocket 的选项设置为Partial,但它不会立即打印出每个字符串。

例如:

Server send:   Hello         Client: print out nothing
Server send:   Today         Client: print out "Hello"
Server send:   Hi            Client: print out nothing
Server send:   Bye           Client: print out "Hi"

我尝试了不同版本的 LoadAsync() 和其他尺寸(不是 256)和 UnconsumedBufferLength。但每次我都有相同的结果。谁能告诉我,怎么了?

最好的问候 DJTrust

【问题讨论】:

您能否更具体地了解服务器的行为?发送的每个字符串之间的时间间隔是多少?发送的字符串是否没有任何分隔符(例如换行符)?您确定服务器工作正常吗?您是否尝试过使用常规桌面 .NET 程序而不是 WinRT API 来测试服务器? 为了它的价值,我试图通过实现一个简单的服务器来发送您描述的字符串并在基本 WinRT 应用程序中运行您的代码来重现您的问题,但我无法重现该问题.所以到目前为止你展示的代码没有任何根本性的错误。如果您需要有关问题的具体帮助,您需要提供可靠地重现问题的 a good, minimal, complete code example。 【参考方案1】:

是的,问题出在服务器端。难以置信,我很确定,java 代码是正确的,因为这方面真的很容易。我太专注于客户端了。

我的错误如下:

...
while(!(in.readLine().equals("quit")))

   String str = in.readLine();
   out.println(str);
   out.flush();

...

有一个in.readLine() 太多了。现在正确的做法是:

String str = "";
while(!(str.equals("quit")))

   str = in.readLine();
   out.println(str);
   out.flush();

我可以咬自己;)。感谢您的提示。

DJ 信托

【讨论】:

以上是关于C# Windows 应用程序从流套接字读取数据不可理解的主要内容,如果未能解决你的问题,请参考以下文章

颤振流套接字

从 C 程序到 C# 的数据传输

C# - 从流中序列化/反序列化 DES 加密文件

通过套接字流发送对象

C#,我可以将文件从流或其他文件保存到我的单个 exe 中吗?

连续从流中读取?