以下是用c#编写的简单服务器和客户端代码段.我想从服务器发送一个字符串数组,并从客户端接收它并显示在控制台上.但是字符串数组没有显示出来.代码有什么问题吗?
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Xml.Serialization;
namespace server
{
class Program
{
static void Main(string[] args)
{
TcpListener tcpListener = new TcpListener(IPAddress.Any, 1234);
tcpListener.Start();
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
byte[] data = new byte[1024];
NetworkStream ns = tcpClient.GetStream();
string[] arr1 = new string[] { "one", "two", "three" };
var serializer = new XmlSerializer(typeof(string[]));
serializer.Serialize(tcpClient.GetStream(), arr1);
int recv = ns.Read(data, 0, data.Length);
string id = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(id);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Xml.Serialization;
namespace Client
{
class Program
{
static void Main(string[] args)
{
try
{
byte[] data = new byte[1024];
string stringData;
TcpClient tcpClient = new TcpClient("127.0.0.1", 1234);
NetworkStream ns = tcpClient.GetStream();
var serializer = new XmlSerializer(typeof(string[]));
var stringArr = (string[])serializer.Deserialize(tcpClient.GetStream());
foreach (string s in stringArr)
{
Console.WriteLine(s);
}
string input = Console.ReadLine();
ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length);
ns.Flush();
}
catch (Exception e)
{
Console.Write(e.Message);
}
Console.Read();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我运行了你的代码,它挂在客户端的这一行
var stringArr = (string[])serializer.Deserialize(tcpClient.GetStream());
Run Code Online (Sandbox Code Playgroud)
然后我对其进行了修改,以便首先从 NetworkStream 读入字节数组,然后使用 MemoryStream 反序列化该字节数组。然后它就按照我的预期工作了。
因此,使用 NetworkStream 进行反序列化可能会出现问题。
XmlSerializer.Deserialize 通过 NetworkStream 的块
查看此 Stackoverflow 问题,XmlSerializer 似乎会继续尝试从流中读取数据,直到到达末尾,这导致了您的问题。
要修复此问题,请按照建议执行操作并首先将要反序列化的数据读取到字节数组中。