【发布时间】:2023-03-28 02:53:01
【问题描述】:
我正在通过 TCP 套接字连接发送一个大字符串 0.443+0.064+-0.120+-0.886+0.15167+-0.26754+0.95153。
我收到的消息与我发送的字符串不相似。它是在随机点切割的,即43+0.064+-0.120+-0.886+0.15167+-0.26754+0
如何确保读取完整的字符串?
这是客户端代码:
public static void SendMessage(string message)
{
if (socketConnection == null)
{
return;
}
using (BinaryWriter writer = new
BinaryWriter(socketConnection.GetStream(), Encoding.ASCII, true))
{
writer.Flush();
writer.Write(message);
writer.Flush();
}
}
这是我的服务器代码:
private void ListenForIncommingRequests()
{
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080);
tcpListener.Start();
connectedTcpClient = tcpListener.AcceptTcpClient();
using (BinaryReader reader = new
BinaryReader(connectedTcpClient.GetStream()))
{
while (true)
{
string clientMessage = reader.ReadString();
}
}
}
【问题讨论】:
-
整个字符串是“0.443+0.064+-0.120+-0.886+0.15167+-0.26754+0.95153”吗?因为如果是这样,它不是很大。但如果它更大,它可能是一个碎片问题。尝试在
while (true)范围之外声明您的string clientMessage,并像这样添加到字符串中:clientMessage += reader.ReadString(); -
你为什么使用8080端口?这通常由 http 服务器使用。
-
@MindSwipe BinaryReader 和 BinaryWriter 使用一种格式,其中字符串前面有一个包含字符串长度的前缀。所以,不能有任何碎片。
-
您在写入 (ASCII) 和读取 (UTF-8) 时使用了不同的编码,这可能会导致较长的字符串出现问题。您是否尝试过在两个地方使用相同的编码?
-
请提供完整的minimal reproducible example,可以用来复现效果。
标签: c# sockets tcp binaryreader binarywriter