2013-08-01 35 views
0

我試圖通過UDP network開發客戶端服務器應用程序。我用listview來顯示聊天。但是,當user1鍵入一個非常長的句子時,listview顯示句子的部分(因爲它只在一行中)。通過UDP套接字(clent-server chat app)獲取收到的數據的數量

因此,如果字符數超過了70,我寫了一個邏輯將sentdata分成幾行。它在服務器端的工作正常,但在客戶端沒有工作。我已經設置緩衝區大小爲2000.

當我試圖打印接收到的數據massage.length在標籤上,它始終顯示它爲2000.(這就是爲什麼,邏輯不工作)。這是什麼原因造成的?如何克服它?我想要收到的消息中的字符數.. H E L P。 M E。(與此發佈代碼)..

public partial class Form1 : Form 
    { 
     Socket sckt; 
     EndPoint epLocal, epRemote; 
     byte[] buffer; 

     public Form1() 
     { 
      InitializeComponent(); 
      txtChat.Text = ""; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //setting up the socket 
      sckt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
      sckt.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

      //getting users' IP 
      txtLocalIp.Text = GetIPLocal(); 
     } 

     private string GetIPLocal() 
     { 
      IPHostEntry host; 
      host = Dns.GetHostEntry(Dns.GetHostName()); 
      foreach (IPAddress ip in host.AddressList) 
       if (ip.AddressFamily == AddressFamily.InterNetwork) 
        return ip.ToString(); 

      return "127.0.0.1"; 
     } 

     private void buttonConnect_Click(object sender, EventArgs e) 
     { 
      if (buttonConnect.Text != "Disconnect !") 
      { 
       //binding socket to the Button 
       epLocal = new IPEndPoint(IPAddress.Parse(txtLocalIp.Text), Convert.ToInt32(txtLocalPort.Text)); 
       sckt.Bind(epLocal); 

       //connecting to Remote IP 
       epRemote = new IPEndPoint(IPAddress.Parse(txtRemoteIp.Text), Convert.ToInt32(txtRemotePort.Text)); 
       sckt.Connect(epRemote); 

       listView1.Columns.Add("",0, HorizontalAlignment.Left); 
       listView1.Columns.Add("starting chat . . .", 444, HorizontalAlignment.Left); 

       //listening to (receiving from) the specific port on Remote side 
       buffer = new byte[2000]; 
       sckt.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer); 
       buttonConnect.Text = "Disconnect !"; 
      } 
      else 
      { 
       txtRemoteIp.Text = ""; 
       buttonConnect.Text = "Connect"; 
      } 
     } 

     private void MessageCallBack(IAsyncResult aResult) 
     { 
      try 
      { 
       if (buttonConnect.Text == "Disconnect !") 
       { 
        byte[] receivedData = new byte[2000]; 
        receivedData = (byte[])aResult.AsyncState; 

        //converting byte[] to string 
        ASCIIEncoding aEncoding = new ASCIIEncoding(); 
        string receivedMessage = aEncoding.GetString(receivedData); 
        Console.Beep(); 
        Thread.Sleep(1000); 
        int l = Convert.ToInt32(receivedData.Length) ; 
        label2.Text = ""; 
        label1.Text = l.ToString(); 
        string[] arr = new string[2]; 
        ListViewItem itm; 
        arr[0] = ""; 

        string firstString = receivedMessage; 
        if (firstString.Length > 70) 
        { 
         firstString = firstString.Remove(70); 
         string renewedString = receivedMessage; 
         renewedString = renewedString.Remove(0, 70); 
         if (renewedString.Length > 70) 
         { 
          string secondstring = renewedString.Remove(70); 
          renewedString = renewedString.Remove(0, 70); 

          if (renewedString.Length <= 70) 
          { 
           string s = "Friend : " + firstString; 
           arr[1] = s; 
           itm = new ListViewItem(arr); 
           listView1.Items.Add(itm); 

           arr[1] = secondstring; 
           itm = new ListViewItem(arr); 
           listView1.Items.Add(itm); 

           arr[1] = renewedString; 
           itm = new ListViewItem(arr); 
           listView1.Items.Add(itm); 
          } 
          else 
          { 
           MessageBox.Show("message too long, reduce size !"); 
          } 


         } 
        } 
        else 
        { 
         arr[1] = "Friend : " + firstString; 
         itm = new ListViewItem(arr); 
         listView1.Items.Add(itm); 


        } 
        //callbacking again 
        buffer = new byte[2000]; 
        sckt.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer); 
       } 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show("ERROR : " + ex.ToString()); 
      } 
     } 

     private void buttonSend_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (buttonConnect.Text == "Disconnect !") 
       { 
        //convert string message to byte[] 
        ASCIIEncoding aEncoding = new ASCIIEncoding(); 
        byte[] sendData = new byte[2000]; 
        sendData = aEncoding.GetBytes(txtChat.Text); 
        //sending the Encoded message 
        sckt.Send(sendData); 

        string[] arr = new string[2]; 
        ListViewItem itm; 
        arr[0] = ""; 

        string firstString = txtChat.Text; 
        if (firstString.Length > 70) 
        { 
         firstString = firstString.Remove(70); 
         string renewedString = txtChat.Text; 
         renewedString = renewedString.Remove(0, 70); 
         if (renewedString.Length > 70) 
         { 
          string secondstring = renewedString.Remove(70); 
          renewedString = renewedString.Remove(0, 70); 

          if (renewedString.Length <= 70) 
          { 
           string s = "me : " + firstString; 
           arr[1] = s; 
           itm = new ListViewItem(arr); 
           listView1.Items.Add(itm); 

           arr[1] = secondstring; 
           itm = new ListViewItem(arr); 
           listView1.Items.Add(itm); 

           arr[1] = renewedString; 
           itm = new ListViewItem(arr); 
           listView1.Items.Add(itm); 
          } 
          else 
          { 
           MessageBox.Show("message too long, reduce size !"); 
          } 


         } 
        } 
        else 
        { 
         arr[1] = "Me123 : " + firstString; 
         itm = new ListViewItem(arr); 
         listView1.Items.Add(itm); 
        } 

        txtChat.Text = ""; 
       } 
       else 
       { 
        MessageBox.Show("Sorry, Session Expired !"); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("ERROR : " + ex.ToString()); 
      } 
     } 
    } 
} 

回答

0

你需要閱讀(和理解)在線幫助有關BeginReceiveFromEndReceiveFrom,在你的代碼的BeginReceiveFrom的最後一個參數是不正確的。

當你調用回調函數,因爲在插座數據接收,一旦你得到你需要調用EndReceiveFrom正確操作完成後插座必須提取從IAsyncResult參數套接字描述符和返回的字節數讀。

我認爲你需要了解如何在AysncFunction的作品,沒有什麼比Visual Studio中的在線幫助更好,在那裏,你得到你所需要才能使用這些功能BeginReceiveFrom/EndReceiveFrom/AsyncCallback的知道的一切,等

+0

@ ja_mesa,您的評論是非常有幫助的。 thnx! :) 和我通過更改一行來解決我的問題.. string receivedMessage = aEncoding.GetString(receivedData).Trim('\ x0'); thnx反正.. –

相關問題