2012-10-31 57 views
0

hercules program which creates a TCPServer my_form讀消息(數據)(的ReadLine()不返回,直到斷開)

我有問題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程序凍結,但如果你關閉通過點擊按鈕Closeread_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

+0

你能提供發送應用程序代碼塊的詳細信息嗎?也許這不是沖洗溪流? – theMayer

+0

如您懷疑的那樣,這可能與行結尾有關。你如何從服務器應用程序發送行結束符?如果你輸入例如是否會創建適當的行尾? 「\ n」還是會發送兩個字符「\」和「n」?你有沒有嘗試發送十六進制'0x0a'? –

+0

不,它正在沖洗,因爲我可以在關閉Hercules時讀取數據。當Hercules(TCPServer)連接時,我無法讀取數據@ rmayer06 – Celik

回答

2

如果您的服務器端沒有使用Stream.WriteLine("something..");,那麼你將在使用ReadLine()函數時,必須始終在客戶端等待End of line char (\r or \n or \r\n)

所以只有當連接關閉=>您的問題時,ReadLine()纔會完成。

您的代碼:

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

用於在客戶端,反饋服務器,它與服務器發送數據沒有任何意義。

通過char讀取char來嘗試您的客戶端,或在特定長度中使用帶有BUFFER的Read()。

相關問題