字节[256]通过TCP限制为5个字符

时间:2014-03-12 23:38:02

标签: c# .net tcpclient

我遇到了TCP服务器\客户端的问题我在.NET 3.5(C#)中编写。

每当我使用下面的代码传输数据时,只有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个字符。其余的都丢失了。

4 个答案:

答案 0 :(得分:3)

Stream.Read可以返回比请求的更少的字节,因此您需要在循环中调用它,直到达到EOF,如下所示:

int bytes;
int offset = 0;

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

此外,你永远不会Dispose()你的流,所以他们可能没有被冲洗。在IDisposable个所有对象周围使用using statement

答案 1 :(得分:1)

Byte[] data = new Byte[256];  

这分配了256个字节

data = System.Text.Encoding.ASCII.GetBytes("auth:" + adminPASS.Text); 

这会丢弃256个字节并转换" auth:" + adminPASS.text到bytes

s.Write(data 0, data.length)

发送5个字节+ adminPASS.text

的长度

看起来你只发送大约5个字节,特别是如果adminPASS.text为空

答案 2 :(得分:0)

您的大多数对象都实现了IDisposable,因此需要位于using块中。

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

答案 3 :(得分:0)

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

mstrMessage = mstrMessage.Substring(0, 5);

所以它只读取前5个字节的数据。将其更改为bytesReceived.Length,它工作正常。