c#字符串数组未显示

5 c# sockets

以下是用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)

Dan*_*anL 3

我运行了你的代码,它挂在客户端的这一行

var stringArr = (string[])serializer.Deserialize(tcpClient.GetStream());
Run Code Online (Sandbox Code Playgroud)

然后我对其进行了修改,以便首先从 NetworkStream 读入字节数组,然后使用 MemoryStream 反序列化该字节数组。然后它就按照我的预期工作了。

因此,使用 NetworkStream 进行反序列化可能会出现问题。

XmlSerializer.Deserialize 通过 NetworkStream 的块

查看此 Stackoverflow 问题,XmlSerializer 似乎会继续尝试从流中读取数据,直到到达末尾,这导致了您的问题。

要修复此问题,请按照建议执行操作并首先将要反序列化的数据读取到字节数组中。