【问题标题】:getting count of received data over UDP socket (client-server chat app)通过 UDP 套接字获取接收数据的计数(客户端-服务器聊天应用程序)
【发布时间】:2013-08-02 12:28:17
【问题描述】:

我试图通过UDP network 开发客户端服务器应用程序。我使用 listview 来显示聊天。但是当用户 1 输入一个很长的句子时,listview 显示了句子的一部分(因为它只占用一行)。

因此,我编写了一个逻辑,如果字符数超过 70,则将 sentdata 拆分为行。它在服务器端工作正常,但在客户端不工作。我已将缓冲区数组大小设置为 2000。

当我尝试在标签上打印接收到的数据massage.length 时,它始终显示为 2000。(这就是逻辑不起作用的原因)。这是什么原因造成的?如何克服它?我想要收到的消息中的字符数..(用这个发布代码)..

    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());
            }
        }
    }
}

【问题讨论】:

    标签: c# visual-studio-2010 sockets udp client-server


    【解决方案1】:

    您需要阅读(并理解)关于BeginReceiveFromEndReceiveFrom的在线帮助,您的代码中BeginReceiveFrom的最后一个参数不正确。

    当你的回调函数被调用,因为套接字中有数据接收,你必须从IAsyncResult参数中提取套接字描述符,一旦你得到你需要调用EndReceiveFrom正确完成操作并返回读取的字节数。

    我认为您需要了解AysncFunction 的工作原理,没有什么比 Visual Studio 的在线帮助更好的了,在那里,您获得了使用这些功能 BeginReceiveFrom/EndReceiveFrom/AsyncCallback 等所需的一切。

    【讨论】:

    • @ja_mesa,你的评论很有帮助。谢谢! :) 我通过将一行更改为.. string receivedMessage = aEncoding.GetString(receivedData).Trim('\x0'); 解决了我的问题thnx 反正..
    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多