这么长的故事,我正在尝试开发一个需要与服务器进行Tcp连接的应用程序。在这个领域没有任何先前的经验,我最终没有任何功能工作。所以我决定制作一个简单的控制台应用程序,只是为了检查我的命令及其响应。关于建立连接的部分进展顺利,关于进入网络流的部分也是如此(我认为)但是当我试图显示服务器响应时我碰到了一个问题: 每当我的porgram到达必须编码服务器响应和WriteLine的行时,我的控制台应用程序全黑,所有文本都消失了。你能告诉我使用的代码有什么问题吗?直到控制台试图显示响应的部分顺利进行,我检查了一下。我想让服务器的响应作为普通字符串(如果可能,我猜...)
static void ServerTalk(TcpClient tcpClient,NetworkStream networkStream, StreamWriter streamWriter, StreamReader streamReader)
{
//Messaging methods:
Console.WriteLine("Client: ");
string message = Console.ReadLine();
streamWriter.WriteLine(message);
streamWriter.Flush();
//Response methode:
byte[] data = new byte[tcpClient.ReceiveBufferSize];
int ret = networkStream.Read(data, 0, data.Length);
string respond = Encoding.ASCII.GetString(data).TrimEnd();
Console.WriteLine("Server: ");
Console.WriteLine(respond);
ServerTalk(tcpClient, networkStream, streamWriter, streamReader);
}
答案 0 :(得分:0)
你只需处理ret字节,你正在翻译数组中的所有字节。
复制到'ret'长的新数组,然后解码。
var retarr = new byte[ret];
Array.Copy(data,retarr,ret);
string respond = Encoding.ASCII.GetString(retarr);
更重要的是要注意这种tcp通信方法不会起作用。您假设当您在一个块中发送x个字节时,您将在一个块中接收x个字节,但事实并非如此,您可以发送1个100字节的消息并接收100个1字节的消息
这意味着你的任务要复杂得多。你需要设计一种发送自我描述数据的方法 - 这样你才能知道它完全被接收了。经典地,您发送一个长度,然后是数据。然后继续循环接收代码,直到收到那么多字节