Чтение сообщения (данных) из буфера TCPServer с использованием StreamReader.ReadLine() в TCPClient(ReadLine() не возвращается до отключения)

программа Геркулес, которая создает TCPServermy_form

У меня проблема с StreamReader.ReadLine() Я написал программу на C#, но только на стороне TCPclient. Я использую программу Hercules для создания TCPServer. Я ввел номер порта и установил соединение. Затем я запустил свою программу и нажал кнопку "Подключиться". тогда у меня была связь с TCPServer.

У меня нет проблем с отправкой данных из TCPClient в Hercules(TCPServer). Как вы видите на картинке, я ввожу строку в "Введено для отправки"EditText, затем я нажал на Send Кнопка и я отправил строку.(Мы можем наблюдать за отправкой данных из части полученных данных.)

До здесь у меня нет проблем. После отправки части я не могу отправить данные из геркулеса (TCPServer) в TCPClient. Чтобы отправить данные, я записал данные в часть " Отправить" и щелкнул Send кнопка. После этого, чтобы увидеть поступающие данные, нажмите Show кнопка..... проблема прямо здесь. Я не могу прочитать данные из буфера ReadStream. Я отладил свою программу и обнаружил проблемную часть:

private void btnShow_Click(object sender, EventArgs e)
    {
        try
        {
            string gelen;
            gelen = read_stream.ReadLine();
            txtReceive.Text = gelen;
            MessageBox.Show(gelen, "you have message from server");
        }
        catch
        {
            MessageBox.Show("message could not taken !!!");
        }
    }

внутри try разделить линию;

gelen = read_stream.ReadLine();

имеет проблему.ReadLine() не читает данные из буфера. вот интересная часть, когда вы отправляете данные и нажимаете Show кнопка программа зависает, но если вы закрываете соединение с hercules.png кликнув Close кнопка, read_stream.ReadLine(); берет данные и помещает в Received: EditText.

  • почему он берет данные, после отключения от TCPServer?
  • Может быть \r\n символы являются проблемой?
  • Я думал, что это ждет следующего персонажа. Итак, когда я отключился, он работает, потому что понимает, что три больше не символ. Мой вопрос таков:

Как я могу использовать read_stream.ReadLine(); принять отправку данных без отключения?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Net;
    using System.Net.Sockets;

    using System.Threading;
    using System.Net.Sockets;
    using System.IO;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;

    namespace CSharpVeriDenemesi
    {
    public partial class Form1 : Form
    {
        //Burda server da tanımladıklarımızdan farklı olarak TcpClient sınıfı ile serverdan gelen bilgileri alıyoruz
    public TcpClient Client;
    private NetworkStream network_stream;
    private StreamReader read_stream;
    private StreamWriter write_stream;

    private string local_host = "localhost";
    private int port_number = 8001;
    public TcpListener listener;
    // IPAddress localAddress = IPAddress.Parse("127.0.0.1");

    public Form1()//form oluşunca otomatik oluşturulan fonksiyon
    {
        InitializeComponent();
    }

    private void btnConnect_Click(object sender, EventArgs e)//CONNECT
    {
        try
        {
            Client = new TcpClient(local_host, port_number);//İlk parametre bilgisayar adı ikincisi ise port numarasıdır.
            MessageBox.Show("Baglandi");
        }
        catch
        {
            MessageBox.Show("Baglanamadi");
            return;
        }
        network_stream = Client.GetStream();
        read_stream = new StreamReader(network_stream);
        write_stream = new StreamWriter(network_stream);

    }

    private void btnDisconnect_Click(object sender, EventArgs e)//DISCONNECT
    {
        txtSend.Text = "Disconnect clicked";
        try
        {
            write_stream.Close();
            read_stream.Close();
            network_stream.Close();
        }
        catch
        {
            MessageBox.Show("Düzgün kapatilamiyor !!!" );
        }
    }

    private void btnReset_Click(object sender, EventArgs e)//send ve receive text.box'larını resetliyor.
    {
        txtSend.Text = "";
        txtReceive.Text = "";     
        MessageBox.Show("Reset'e basıldı");          
    }

    private void Form1_Load(object sender, EventArgs e)//sayfa ilk açıldığında olcaklar için açılan dosya
    {

    }

    private void btnSend_Click(object sender, EventArgs e)//veriyi server'a gönderiyor
    {

        try
        {
            write_stream.WriteLine(txtSend.Text);
            write_stream.Flush();  //veriyi gönderiyor
            MessageBox.Show("Veri gönderildi");
        }
        catch {
            MessageBox.Show("Veri gönderilmedi !!!");          
        }            
    }

    private void btnShow_Click(object sender, EventArgs e)
    {
        try
        {
            string gelen;
            gelen = read_stream.ReadLine();
            txtReceive.Text = gelen;
            MessageBox.Show(gelen, "you have message from server");
        }
        catch
         {
            MessageBox.Show("message could not taken !!!");
        }
    }
    }
    }

Вот мой main.cs Я забыл добавить его. вы можете написать его и попробовать мой проект... примечание: вот ссылка на hercules, которую он переносит, вы можете легко запустить его [ http://www.hw-group.com/products/hercules/index_en.html] 3

1 ответ

Решение

Если ваша серверная сторона не использует Stream.WriteLine("something.."); тогда вам всегда придется ждать End of line char (\r or \n or \r\n) на стороне клиента при использовании функции ReadLine().

Таким образом, ReadLine() завершится только тогда, когда соединение закрыто => ваша проблема.

Ваш код:

        write_stream.WriteLine(txtSend.Text);
        write_stream.Flush();  //veriyi gönderiyor

используется на стороне клиента, для сервера обратной связи, это не имеет значения для сервера, отправляющего данные.

Попробуйте на стороне клиента, читая char за char, или используйте Read() с BUFFER определенной длины.

Другие вопросы по тегам