我有問題StreamReader.ReadLine()
method.I寫了一個C#程序,但只有TCP客戶端。我正在使用Hercules程序來創建一個TCPServer。我輸入了端口號並建立了連接。然後我跑我的程序,並點擊連接按鈕。那麼,我與TCPServer有聯繫。
我從TCPClient發送數據到Hercules(TCPServer)沒有問題。正如你在圖片中看到的,我將字符串輸入到「輸入發送」EditText中,然後我點擊到Send
按鈕,並且我發送了字符串(我們可以從接收到數據部分觀察發送數據。)
直到這裏,我沒有問題。發送完成後,我無法將數據從hercules(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
程序凍結,但如果你關閉通過點擊按鈕Close
,read_stream.ReadLine();
走的是數據和投入的收到hercules.png
連接:的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我忘了添加它。你可以寫,並嘗試我的項目... 注:這裏是它是可移植的鏈接,大力士,您可以輕鬆地運行[http://www.hw-group.com/products/hercules/index_en.html]3
你能提供發送應用程序代碼塊的詳細信息嗎?也許這不是沖洗溪流? – theMayer
如您懷疑的那樣,這可能與行結尾有關。你如何從服務器應用程序發送行結束符?如果你輸入例如是否會創建適當的行尾? 「\ n」還是會發送兩個字符「\」和「n」?你有沒有嘗試發送十六進制'0x0a'? –
不,它正在沖洗,因爲我可以在關閉Hercules時讀取數據。當Hercules(TCPServer)連接時,我無法讀取數據@ rmayer06 – Celik