我最近想学网络编程方面,但是做的聊天程序很不成功,有哪位高手可以不啻赐教,编写一个让我研究一下?

解决方案 »

  1.   

    MSDN多的是

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    //添加的命名空间引用
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    namespace UdpChatExample
    {
        public partial class FormChat : Form
        {
            delegate void AddListBoxItemCallback(string text);
            AddListBoxItemCallback listBoxCallback;
            //使用的接收端口号
            private int port = 8001;
            private UdpClient udpClient;
            public FormChat()
            {
                InitializeComponent();
                listBoxCallback = new AddListBoxItemCallback(AddListBoxItem);
            }
            private void AddListBoxItem(string text)
            {
                //如果listBoxReceive被不同的线程访问则通过委托处理;
                if (listBoxReceive.InvokeRequired)
                {
                    this.Invoke(listBoxCallback, text);
                }
                else
                {
                    listBoxReceive.Items.Add(text);
                    listBoxReceive.SelectedIndex = listBoxReceive.Items.Count - 1;
                }
            }
            /// <summary>
            /// 在后台运行的接收线程
            /// </summary>
            private void ReceiveData()
            {
                //在本机指定的端口接收
                udpClient = new UdpClient(port);
                IPEndPoint remote = null;
                //接收从远程主机发送过来的信息;
                while (true)
                {
                    try
                    {
                        //关闭udpClient时此句会产生异常
                        byte[] bytes = udpClient.Receive(ref remote);
                        string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
                        AddListBoxItem(string.Format("来自{0}:{1}", remote, str));
                    }
                    catch
                    {
                        //退出循环,结束线程
                        break;
                    }
                }
            }
            /// <summary>
            /// 发送数据到远程主机
            /// </summary>
            private void sendData()
            {
                UdpClient myUdpClient = new UdpClient();
                IPAddress remoteIP;
                if (IPAddress.TryParse(textBoxRemoteIP.Text, out remoteIP) == false)
                {
                    MessageBox.Show("远程IP格式不正确");
                    return;
                }
                IPEndPoint iep = new IPEndPoint(remoteIP, port);
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(textBoxSend.Text);
                try
                {
                    myUdpClient.Send(bytes, bytes.Length, iep);
                    textBoxSend.Clear();
                    myUdpClient.Close();
                    textBoxSend.Focus();
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message, "发送失败");
                }
                finally
                {
                    myUdpClient.Close();
                }
            }
            private void FormChat_Load(object sender, EventArgs e)
            {
                //设置listBox样式
                listBoxReceive.HorizontalScrollbar = true;
                listBoxReceive.Dock = DockStyle.Fill;
                //获取本机第一个可用IP地址
                IPAddress myIP = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);
                //为了在同一台机器调试,此IP也作为默认远程IP
                textBoxRemoteIP.Text = myIP.ToString();
                //创建一个线程接收远程主机发来的信息
                Thread myThread = new Thread(new ThreadStart(ReceiveData));
                //将线程设为后台运行
                myThread.IsBackground = true;
                myThread.Start();
                textBoxSend.Focus();
            }
            /// <summary>
            /// 单击发送按钮触发的事件
            /// </summary>
            private void buttonSend_Click(object sender, EventArgs e)
            {
                sendData();
            }
            /// <summary>
            /// 在textBoxSend中按下并释放Enter键后触发的事件
            /// </summary>
            private void textBoxData_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar == (char)Keys.Enter)
                    sendData();
            }
            private void FormChat_FormClosing(object sender, FormClosingEventArgs e)
            {
                udpClient.Close();
            }
        }
    }
        (3) 按<F5>键编译并执行,向默认远程主机发送一些信息,运行效果如图3-2所示。