首页 > 解决方案 > 开关盒没有变化

问题描述

Github 项目仓库链接

这是服务器

static void Main(string[] args)
        {
            string path = Directory.GetCurrentDirectory();
            List<string> filesList = new List<string>();
            IPAddress hostname = IPAddress.Parse("192.168.0.253");
            Int32 port = 9999;
            TcpListener server = null;
            TcpClient client = null;
            string data = null;
            BinaryFormatter bf = new BinaryFormatter();

            server = new TcpListener(hostname, port);
            server.Start();
            Console.WriteLine("server has started ");
            client = server.AcceptTcpClient();
            Console.WriteLine("server accepts clients now");
            NetworkStream dataStream = client.GetStream();
            Console.WriteLine("server started data stream");
            byte[] bytes = new byte[client.ReceiveBufferSize];
            dataStream.Read(bytes, 0, bytes.Length);
            data = System.Text.Encoding.ASCII.GetString(bytes);
            string cleanData = data.Replace("\0", "");
            Console.WriteLine(cleanData);
            do
            {
                try
                {

这是问题所在

                    switch (cleanData)
                    {
                        case "1":
                            List<string> dir = new List<string>();
                            string message = $"Current path is: {path}";
                            dir.Add(message);
                            bf.Serialize(dataStream, dir);
                            dataStream.Flush();

                            break;
                        case "2":
                            string[] files = Directory.GetFiles(path);
                            foreach (var file in files)
                            {
                                filesList.Add(file);

                            }

                            bf.Serialize(dataStream, filesList);
                            filesList.Clear();
                            filesList.ForEach(Console.WriteLine);
                            dataStream.Flush();

                            break;
                        default:
                            Console.WriteLine("waiting for input");

                            dataStream.Flush();

                            break;
                    }
            }
            catch (Exception e)
            {
                throw e;
            }
        } while (true);

    }

这是客户

public partial class Form1 : Form
    {

        string hostname = "192.168.0.253";
        int port = 9999;
        TcpClient client = new TcpClient();
        NetworkStream serverStream = default(NetworkStream);


        public Form1()
        {
            InitializeComponent();
            client.Connect(hostname, port);
            checkedListBox1.Items.Add("Connected to the main server");
        }


        private void GetList()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            serverStream = client.GetStream();
            int buff = 0;
            byte[] instream = new byte[client.ReceiveBufferSize];
            buff = client.ReceiveBufferSize;
            List<string> data = (List<string>)formatter.Deserialize(serverStream);
            //string data = System.Text.Encoding.ASCII.GetString(instream);
            foreach (var item in data)
            {
                checkedListBox1.Items.Add(item);

            }
            serverStream.Flush();
            return;


        }

        private void getData()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            serverStream = client.GetStream();
            int buff = 0;
            byte[] instream = new byte[client.ReceiveBufferSize];
            buff = client.ReceiveBufferSize;
            List<string> data = (List<string>)formatter.Deserialize(serverStream);
            foreach (var item in data)
            {
                checkedListBox1.Items.Add(item);
            }

            serverStream.Flush();
            return;
        }

        private void ShowItems_Click(object sender, EventArgs e)
        {
            string message = "2";
            byte[] dataToSend = Encoding.ASCII.GetBytes(message);
            NetworkStream dataStream = client.GetStream();
            dataStream.Write(dataToSend, 0, dataToSend.Length);
            dataStream.Flush();
            GetList();
            return;
        }

        private void ReloadItems_Click(object sender, EventArgs e)
        {
            checkedListBox1.Items.Clear();
            string message = "2";
            byte[] dataToSend = Encoding.ASCII.GetBytes(message);
            NetworkStream dataStream = client.GetStream();
            dataStream.Write(dataToSend, 0, dataToSend.Length);
            dataStream.Flush();
            GetList();
            return;

        }

        private void DownloadItems_Click(object sender, EventArgs e)
        {
            List<string> itemsToDownload = new List<string>();
            foreach (var item in checkedListBox1.CheckedItems)
            {
                itemsToDownload.Add(item as string);
            }
            return;
        }

        private void ShowDir_Click(object sender, EventArgs e)
        {

            string message = "1";
            byte[] dataToSend = Encoding.ASCII.GetBytes(message);
            NetworkStream dataStream = client.GetStream();
            dataStream.Write(dataToSend, 0, dataToSend.Length);
            dataStream.Flush();
            getData();
            return;
        }
    }
}

所以我试图让这个带有客户端的数据存储服务器能够下载并将我的所有数据存储在一个设备中,就像我自己的云一样,但我遇到了一个我无法解决的问题,那就是服务器中的 switch 语句,它似乎卡在 switch 上,如果我删除 do 循环,它只会结束程序。
如果需要运行程序,我还添加了客户端和 github 存储库。

服务器在 .net-core 中制作,客户端在 windows 窗体应用程序中均在 Visual Studio 2019 上制作

标签: c#networking.net-coreserverclient

解决方案


我需要在 do 循环中添加变量 cleadata 以在每次开关中断后刷新开关的值

            do
            {
                    data = System.Text.Encoding.ASCII.GetString(bytes);
                    string cleanData = data.Replace("\0", ""); 
                    Console.WriteLine(cleanData); 
                try
                {

                    switch (cleanData)
                    {
                        case "1":
                            List<string> dir = new List<string>();
                            string message = $"Current path is: {path}";
                            dir.Add(message);
                            bf.Serialize(dataStream, dir);
                            dataStream.Flush();

                            break;
                        case "2":
                            string[] files = Directory.GetFiles(path);
                            foreach (var file in files)
                            {
                                filesList.Add(file);

                            }

                            bf.Serialize(dataStream, filesList);
                            filesList.Clear();
                            filesList.ForEach(Console.WriteLine);
                            dataStream.Flush();

                            break;
                        default:
                            Console.WriteLine("waiting for input");

                            dataStream.Flush();

                            break;
                    }

            }

推荐阅读