Простой способ отправки строк и файлов через TCPIP - PullRequest
0 голосов
/ 03 июня 2018

Я хочу сделать простое клиент-серверное приложение.Сервер ожидает подключения от клиентов.Клиент может отправлять различные запросы (короткие строки длиной менее 100 символов) на сервер, и сервер должен отвечать на эти запросы, отправляя строки или файлы.Я нашел в сети код, который использует tcpListener.AcceptSocket (), и я могу отправлять и получать строки с сервера и код, который использует tcpListener.AcceptTcpClient (), и я могу отправлять файлы другой серверной программе.Ниже есть функция для отправки файлов через TcpIP и одна для отправки строк через TcpIP.Как должен выглядеть код сервера, чтобы объединить обе функции?Сервер представляет собой консольную программу.

    public void SendFileViaTCP(string sFile, string sIPAddress, int portNo)
    {
        byte[] sendingBuffer = null;
        TcpClient client = null;
        toolStripStatusLabel1.Text = "";
        lbConnect.Items.Clear();
        progressBar1.Value = 0;
        Application.DoEvents();
        NetworkStream networkStream = null;
        int bufferSize = 5000;
        string checksum = CalculateMD5(sFile);
        lbConnect.Items.Add("File " + sFile + " checksum = " + checksum);
        try
        {
            client = new TcpClient(sIPAddress, portNo);
            toolStripStatusLabel1.Text = "Connected to the Server...\n";
            networkStream = client.GetStream();
            FileStream fileStream = new FileStream(sFile, FileMode.Open, FileAccess.Read);
            long fsLength = fileStream.Length;
            int nPackets = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(fsLength) / Convert.ToDouble(bufferSize)));
            progressBar1.Maximum = nPackets;
            Application.DoEvents();

            int currentPacketLength;
            for (int i = 0; i < nPackets; i++) {
                if (fsLength > bufferSize) {
                    currentPacketLength = bufferSize;
                    fsLength -= currentPacketLength;
                    Application.DoEvents();
                }
                else {
                    currentPacketLength = Convert.ToInt32(fsLength);
                }

                sendingBuffer = new byte[currentPacketLength];
                fileStream.Read(sendingBuffer, 0, currentPacketLength);
                networkStream.Write(sendingBuffer, 0, (int)sendingBuffer.Length);

                progressBar1.PerformStep();
                Application.DoEvents();
            }

            toolStripStatusLabel1.Text = "Sent " + fileStream.Length.ToString() + " bytes to the server";
            fileStream.Close();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
        finally {
            networkStream.Close();
            client.Close();
        }
    }

    void SendString(string str, string sIPAddress, int portNo)      
    {
        try {
            TcpClient tcpClient = new TcpClient();
            lbConnect.Items.Add("Connecting...");
            Application.DoEvents();

            // use the ipaddress as in the server program
            var tsk = tcpClient.ConnectAsync(sIPAddress, portNo);
            tsk.Wait(3000);  // here we set how long we want to wait before deciding the server is not responding.            

            lbConnect.Items.Add("Connected");
            lbConnect.Items.Add("Sending string: " + str);
            Application.DoEvents();

            Stream stream = tcpClient.GetStream();

            ASCIIEncoding asen= new ASCIIEncoding();

            byte[] ba=asen.GetBytes(str);
            lbConnect.Items.Add("Transmitting...");
            Application.DoEvents();

            stream.Write(ba,0,ba.Length);

            byte[] bb=new byte[100];
            int k = stream.Read(bb,0,100);

            string sResponse = string.Empty;
            for (int i = 0; i < k; i++) {
                sResponse += Convert.ToChar(bb[i]);
            }

            lbConnect.Items.Add(sResponse);
            Application.DoEvents();

            tcpClient.Close();
        }
        catch (Exception e) {
            lbConnect.Items.Add("Error: " + e.StackTrace);
            Application.DoEvents();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...