我遇到了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个字符。其余的都丢失了。
答案 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,它工作正常。