2013-08-01 36 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反正.. –

相关问题