Чтение сообщения (данных) из буфера TCPServer с использованием StreamReader.ReadLine() в TCPClient(ReadLine() не возвращается до отключения)
У меня проблема с 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 определенной длины.