2012-10-03 207 views
0

這是我的程序的服務器代碼,它正在工作,但是在它發送數據後它就卡住了。我需要刷新它並準備好再次發送數據。客戶端和服務器之間的UDP連接

Server代碼:

private void button1_Click(object sender, EventArgs e) { 
    try { 
     String text = textBox1.Text; 
     UdpClient udpc = new UdpClient(text,8899); 
     IPEndPoint ep = null; 

     while (true) { 
      MessageBox.Show("Name: "); 
      string name = textBox2.Text; 

      if (name == "") break; 

      byte[] sdata = Encoding.ASCII.GetBytes(name); 
      udpc.Send(sdata, sdata.Length); 

      if (udpc.Receive(ref ep)==null) {    
       MessageBox.Show("Host not found"); 
      } else {     
       byte[] rdata = udpc.Receive(ref ep); 
       string job = Encoding.ASCII.GetString(rdata); 
       MessageBox.Show(job); 
      } 
     } 
    } catch { 
     MessageBox.Show("Error Restarting"); 
    } 

客戶端代碼:

private void button1_Click(object sender, EventArgs e) { 
    try { 
     UdpClient subscriber = new UdpClient(8899); 
     IPAddress addr = IPAddress.Parse("127.0.0.2"); 
     subscriber.JoinMulticastGroup(addr); 
     IPEndPoint ep = null; 

     for (int i = 0; i < 1; i++) { 
      byte[] pdata = subscriber.Receive(ref ep); 
      string strdata = Encoding.ASCII.GetString(pdata); 
      MessageBox.Show(strdata); 
      textBox1.Text = strdata; 
      pass = strdata; 
     } 
     subscriber.DropMulticastGroup(addr); 
    } catch { 
     Refresh(); 
     MessageBox.Show("Not Found"); 
    } 
} 

服務器可以將數據發送到一個客戶端。 我想一次發送一個客戶端。但發送數據後,服務器卡住了。

我需要它刷新並重新發送數據給客戶端。

+0

你是什麼意思:它卡住了?是否有錯誤或掛起? – TimVK

+0

我無法訪問按鈕和任何我必須通過任務管理器關閉它 – user1713389

+0

您正在等待響應,但UDP無狀態和數據接收不能保證,所以如果由於任何原因它發送它,它永遠不會到達它沒有排序就像TCP ..如果你需要保證交付,你需要TCP – BugFinder

回答

0

如果我理解你的代碼,從服務器發送數據,然後等待答案。在客戶端,您只需獲取數據,但不能發回任何內容。除非你提供套接字超時,否則它將無限期地等待,直到有東西到達。

+0

我認爲這是問題,但如何給出時間 – user1713389

+0

我不用UDPClient可能的事情。嘗試Socket類並從那裏擴展... –

0

服務器端的udpc.Receive()方法將阻塞直到數據報從客戶端接收。 UDP不可靠。這意味着服務器不會期待來自其他方的任何ACK。所以你可以簡單地刪除這部分代碼。或者如果你需要確保消息的到達,運行爲每個客戶單獨的線程如下:

private void button1_Click(object sender, EventArgs e) { 
    System.Threading.Thread Server_thread = new Thread(My_Send_Function); 
    Server_thread .Start(); 
} 

private void My_Send_Function() { 
    try { 
     String text = textBox1.Text; 
     UdpClient udpc = new UdpClient(text,8899); 
     IPEndPoint ep = null; 

     while (true) { 
      MessageBox.Show("Name: "); 
      string name = textBox2.Text; 

      if (name == "") break; 

      byte[] sdata = Encoding.ASCII.GetBytes(name); 
      udpc.Send(sdata, sdata.Length); 

      if (udpc.Receive(ref ep)==null) { 
       MessageBox.Show("Host not found"); 
      } else { 
       byte[] rdata = udpc.Receive(ref ep); 
       string job = Encoding.ASCII.GetString(rdata); 
       MessageBox.Show(job); 
      } 
     } 
    } catch { 
     MessageBox.Show("Error Restarting"); 
    } 
} 
0

你不應該在主UI線程(裏面的button1_Click)使用udpc.Receive()。如果你這樣做,你的應用程序將掛起,直到有東西到達。使用超時也不是解決方案。應用程序將掛起,直到超時過期。相反,您必須使用多個線程。您可以通過使用BeginReceive而不是Receive來實現,或者通過顯式創建新線程並使用Receive來實現。如果你谷歌的「在c#中的異步udp套接字」或類似的東西,那麼你會發現很多關於如何正確設置它的例子。

相關問題