2014-03-07 67 views
0
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.IO; 
using System.Threading; 


namespace MultiClientServer 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void button1_Click(object sender, EventArgs e) 
     { 
      TcpListener listner = new TcpListener(new IPEndPoint(IPAddress.Loopback, 8000)); 
      listner.Start(); 
      textBox1.Text += "Started TCP Server"+Environment.NewLine; 
      listner.BeginAcceptTcpClient(new AsyncCallback(Accept), listner); 
     } 

     void Accept(IAsyncResult result) 
     { 
      textBox1.Invoke(new MethodInvoker(delegate() 
       { 
        textBox1.Text += "Client Request Arrived" + Environment.NewLine; 
       })); 
      TcpListener listner1 = (TcpListener)result.AsyncState; 
      TcpClient client = listner1.EndAcceptTcpClient(result); 
      textBox1.Invoke(new MethodInvoker(delegate() 
       { 
        textBox1.Text += "Client Request Approved" + Environment.NewLine; 
       })); 
      Thread th = new Thread(new ParameterizedThreadStart(ContinueRcv)); 
      th.Start(client); 
     } 

     void ContinueRcv(object obj) 
     { 
      TcpClient client = (TcpClient)obj; 
      StreamReader sr = new StreamReader(client.GetStream()); 
      textBox1.Invoke(new MethodInvoker(delegate() 
       { 
        textBox1.Text += sr.ReadLine() + Environment.NewLine; 
       })); 
     } 
    } 
} 

我試圖讓這個應用程序,這樣,當一個客戶端連接不是一個新的線程將b創建,它將b在繼續接受.. BT是不是很遺憾.. PLZ給我的解決方案使用此代碼..意味着它不是一個類的要求或任何..我jux想知道如何做到這一點或以任何相關的方式..爲什麼我的線程不能連續工作

+0

「客戶端」和「SR」不應該從recv線程作爲表單類的成員進行訪問,以開始。你需要在線程創建時將「客戶端」傳遞給線程,否則它很容易被另一個接收到的線程覆蓋。因爲類似的原因,'sr'應該是線程中的局部。 –

+0

明白了..讓我檢查這個.. – rummykhan

+0

我已經檢查沒有改變代碼..我可以做thix而在我的線程bt我不認爲這是一個很好的做法..你有什麼想法..? ? – rummykhan

回答

1

線程是不是被連續調用,您的代碼在線程塊中需要連續調用,因爲您的線程負責調用ContinueRcv線程以此方法結束,

如果你想繼續接收來自Stream你需要調用的StreamReader的的ReadLine()在某些無限循環的數據,

void ContinueRcv(object obj) 
{ 
    TcpClient client = (TcpClient)obj; 
    StreamReader sr = new StreamReader(client.GetStream()); 
    while (true) 
    { 
     if (!connection) { // when connection closed, abort, terminated 
      break; 
     } 
     msg = sr.ReadLine(); 
     textBox1.Invoke(new MethodInvoker(delegate() 
     { 
      textBox1.Text += msg + Environment.NewLine; 
     })); 
    } 
} 

記住打破循環的時候連不上,