C# TCP上的字节[256]限制为5个字符

C# TCP上的字节[256]限制为5个字符,c#,.net,tcpclient,C#,.net,Tcpclient,我在.NET 3.5(C#)中编写的TCP服务器\客户端出现问题 每当我使用下面的代码传输数据时,只有5个字符传输到服务器。我如何修复我的代码,使我有超过5个字符 TcpClient client = new TcpClient(connectto.ToString(), portto); Stream s = client.GetStream(); StreamReader sr = new StreamReader(s); StreamWriter sw = new StreamWriter

我在.NET 3.5(C#)中编写的TCP服务器\客户端出现问题

每当我使用下面的代码传输数据时,只有5个字符传输到服务器。我如何修复我的代码,使我有超过5个字符

TcpClient client = new TcpClient(connectto.ToString(), portto);
Stream s = client.GetStream();
StreamReader sr = new StreamReader(s);
StreamWriter sw = new StreamWriter(s);

Byte[] data = new Byte[256];
data = System.Text.Encoding.ASCII.GetBytes("auth:" + adminPASS.Text);

s.Write(data, 0, data.Length);

data = new Byte[256];

String responseData = String.Empty;

Int32 bytes = s.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);

服务器仅获取传输内容的前5个字符。其余部分丢失。

您的大多数对象实现IDisposable,因此需要在
中使用

使用
块可确保调用
Dispose
方法。在这种情况下,
Dispose
将刷新缓冲区并等待所有数据发送

Byte[] data = new Byte[256];  
这分配了256个字节

data = System.Text.Encoding.ASCII.GetBytes("auth:" + adminPASS.Text); 
这将丢弃256字节,并将“auth:+adminPASS.text”转换为字节

s.Write(data 0, data.length)
发送5个字节+adminPASS.text的长度

看起来您只发送了大约5个字节,特别是当adminPASS.text为空时

返回的字节数可能比请求的少,因此您需要在达到EOF之前循环调用它,如下所示:

int bytes;
int offset = 0;

while ((bytes = s.Read(data, offset, data.Length - offset) != 0)
{
   offset += bytes;
}

此外,您从不
Dispose()
您的流,因此它们很可能不会被刷新。在所有的
IDisposable
对象周围使用一个字符串。

没关系,获取要在服务器上使用的字符串的原始代码是

mstrMessage = mstrMessage.Substring(0, 5);

所以它只读取前5个字节的数据。将此更改为bytesReceived.Length,效果良好。

您能验证adminPASS.Text是否为空吗?写入时也调用s.Flush()。即使我添加了一个保护以确保文本框的值不为空,数据似乎仍然无法通过。我还有一个文本为“connected”的字符串,它是在初始连接到服务器时发送的。在VisualStudio的输出日志中,我得到这个“get message conne”,然后在它的正下方得到“get message”。我还尝试使用s.Flush(),但没有任何更改。你知道你没有发送数据的
Byte[256]
,你创建了一个256大数组,但当你执行
data=System.Text.Encoding…
时,它会立即扔掉。这就像你做的那样
Byte[]data=System.Text.Encoding…
。在做了一些测试之后,我发现只有从客户端发送到服务器的数据丢失了。从服务器到客户端的数据保持不变。这听起来更像是一个注释而不是答案。详细说明对IDisposable.Dispose()的缺少调用导致观察到的行为的原因将显著改善答案。这是一个很好的信息,但缺少数据很可能是由于缓冲区未刷新造成的(请参见John的答案和@payo的评论).从标题中可以看出,他希望传输256个字节。当然不是。你是对的,刷新“可能”有帮助,但不太可能,因为很少有人发送这样的小消息,所以如果他得到5个字节,那么刷新不太可能影响itI。我尝试了你所说的流代码。读取函数。。。到目前为止,它只导致客户端挂起并停止响应。我是否也需要将此代码添加到流编写器中?@ThemstftCPU如他所说,它将循环直到达到结束EOF,因此发送方需要关闭连接以停止循环。如果您正试图准确地填充
data.Length
字节,则可以在开始处添加
偏移量
)。