自己琢磨老半天,本地可以发给自己,可是发给隔壁宿舍的朋友,就没办法一起聊天。见鬼。给一个可行的代码,或者……帮我修改下代码。万分感谢!

解决方案 »

  1.   

    版本1
            private void button_Send_Click(object sender, EventArgs e)
            {
                string str = RTB_Message.Text.Trim();
                if (str.Length == 0) return;
                Send(str);
            }        void Send(string msg)
            {
                Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                //IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255
                IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
                string hostname = Dns.GetHostName();
                byte[] data = Encoding.Unicode.GetBytes(msg);
                sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
                //sock.SendTo(data, iep1);
                sock.SendTo(data, iep2);
                sock.Close();
            }        bool b = true;        void Connection()
            {            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
                sock.Bind(iep);
                Writes("Ready to receive…");
                while (b)
                {
                    EndPoint ep = (EndPoint)iep;
                    byte[] data = new byte[1024];
                    int recv = sock.ReceiveFrom(data, ref ep);
                    string stringData = Encoding.Unicode.GetString(data, 0, recv);                //Writes(string.Format("\nreceived1: from: {0}\n{1}", ep, stringData));                //stringData = Encoding.Unicode.GetString(data, 0, recv);                Writes(string.Format("\nreceived2: from: {0}\n{1}", ep, stringData));
                }
                sock.Close();
                //Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                //IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 4567);
                //socket.Bind(ipe);
                //IPAddress ip = IPAddress.Parse("239.255.255.1");
                //socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any));            //while (b)
                //{
                //    byte[] buffer = new byte[2048];
                //    socket.Receive(buffer);            //    string str = Encoding.Unicode.GetString(buffer).Trim('\u0000');
                //    if (str == "System|Iamclose()")
                //    {
                //        str = "该IP已经下线了!!";
                //    }
                //    Writes(string.Format("\t\n对方IP:{0}时间:{1}\t\n{2}", ipe.Address,DateTime.Now.ToLongTimeString(), str));
                //}
            }
            void Writes(string str)
            {
                if (RTB_Content.InvokeRequired)
                    RTB_Content.Invoke(new DE(Writes), new object[] { str });
                else
                    RTB_Content.Text += str;
            }
            delegate void DE(string str);
            Thread t;
            private void Form1_Load(object sender, EventArgs e)
            {
                t = new Thread(Connection);
                t.IsBackground = true;
                t.Start();
            }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                b = false;
                Send("对方已关闭连接……");
            }        private void RTB_Message_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Control && e.KeyCode == Keys.Enter)
                {
                    button_Send_Click(null, null);
                    RTB_Message.Focus();
                    RTB_Message.Clear();
                    e.Handled = true;
                }
            }
    版本1
      

  2.   

    版本2        private UdpClient m_Client;        private int ListenerPort = 8080;
            private int SenderPort = 8080;
            /// <summary>
            /// 本地IP。
            /// </summary>
            private int LocalPort;
            /// <summary>
            /// 远程IP。
            /// </summary>
            private int RemotePort;        private string m_szHostName;
            /// <summary>
            /// 广播对象。
            /// </summary>
            private IPAddress m_GroupAddress;
            /// <summary>
            /// 解析主机。
            /// </summary>
            private IPHostEntry m_LocalHost;
            /// <summary>
            /// 远程终结点。
            /// </summary>
            private IPEndPoint m_RemoteEP;        /// <summary>
            ///完成侦听。 
            /// </summary>
            private bool m_Done = false;        public Form2()
            {
                InitializeComponent();
            }
            delegate void WriteDelegate(string msg);
            private void WriteWord(string msg)
            {
                if (RTB_Content.InvokeRequired)
                    RTB_Content.Invoke(new WriteDelegate(WriteWord), new object[] { msg });
                else
                    RTB_Content.Text += msg + "\r\n";
            }
            Thread t = null;
            private void Form2_Load(object sender, EventArgs e)
            {
                LocalPort = SenderPort;
                RemotePort = ListenerPort;            m_szHostName = Dns.GetHostName();//获取本地计算机名。
                m_LocalHost = Dns.GetHostEntry(m_szHostName); //解析主机            WriteWord(string.Format("本地端口:{0},远程端口:{1}……", LocalPort, RemotePort));
                WriteWord("正在初始化……");            Initialize(); //初始化本机以及加入广播组。            WriteWord("正在启动侦听器线程……");            t = new Thread(new ThreadStart(Listener));//建立线程
                t.IsBackground = true;
                t.Start();//开始侦听。
            }        public void Initialize()
            {            // 
                // 实例化 UdpCLient 
                // 
                m_Client = new UdpClient(LocalPort);
                // 
                // 创建多路广播组对象 
                // 
                m_GroupAddress = IPAddress.Parse("224.224.224.224");            // 
                // 联接组 
                // 
                try
                {
                    m_Client.JoinMulticastGroup(m_GroupAddress, 100);
                }
                catch (Exception)
                {
                    Console.WriteLine("无法联接多路广播组");
                }            // 
                // 创建对方主机的终结点 
                // 
                m_RemoteEP = new IPEndPoint(m_GroupAddress, RemotePort);        }        public void Listener()
            {
                // 
                // 侦听器等待数据到来 
                // 并用缓冲区保存它。 
                Thread.Sleep(2000); // 确保 client2 正在接收             Encoding Default = Encoding.Default;            while (!m_Done)
                {
                    IPEndPoint endpoint = null;//对方主机
                    Byte[] data = m_Client.Receive(ref endpoint);//返回对方的IP,进行初始化。并返回数据。                String strData = Default.GetString(data);                if (strData.IndexOf(":@") > 0)
                    {
                        // 
                        // 我们接收到一个终止指示, 
                        // 现在我们必须确定它是来 
                        // 自我们的主线程的关闭, 
                        // 还是来自其他地方 
                        // 
                        Char[] separators = { ':' };
                        String[] vars = strData.Split(separators);                    if (vars[0] == m_szHostName)
                        {
                            // 
                            // 这是来自我们自己的线程,因此 
                            // 立即结束 
                            // 
                            WriteWord("正在关闭侦听器线程 ");                        // 
                            // 此过程应已由主线程完成了,但为 
                            // 安全起见,我们再执行一次 
                            // 
                            m_Done = true;
                        }
                        else
                        {
                            // 
                            // 这是来自其他地方的 
                            // 
                            WriteWord(string.Format("{0} 已离开对话", vars[0]));
                        }
                    }
                    else
                    {
                        // 
                        // 这是从其他地方以及我们自己 
                        // 处接收到的正常数据 
                        // 在输出前,查看它是否来自我 
                        // 们自己 
                        // 
                        if (strData.IndexOf(":") > 0)
                        {
                            Char[] separators = { ':' };
                            String[] vars = strData.Split(separators);                        //if (vars[0] != m_szHostName)
                            //{
                            WriteWord(strData);//可以接收自己的信息。
                            //}
                        }
                    }
                }
                WriteWord("侦听器线程已完成 ");
            }        private void button_Send_Click(object sender, EventArgs e)
            {
                string str = RTB_Message.Text.Trim();
                if (str.Length == 0) return;
                Send(str);        }        void Send(string s)
            {
                Byte[] buffer = null;
                Encoding Default = Encoding.Default;            s = m_szHostName + ":" + s;
                buffer = new Byte[s.Length * 2 + 2];
                // 
                // 将数据发送给远程对方主机 
                //             int len = Default.GetBytes(s.ToCharArray(), 0, s.Length, buffer, 0);            int ecode = m_Client.Send(buffer, len, m_RemoteEP);            if (ecode <= 0)
                {
                    WriteWord("发送时出错:" + ecode);
                }
            }        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                Send("@");
                t.Abort();
                t.Join();            WriteWord("正在关闭连接 ");            Terminate();        }        public void Terminate()
            {
                m_Client.DropMulticastGroup(m_GroupAddress);
            }        private void RTB_Message_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Control && e.KeyCode == Keys.Enter)
                {
                    button_Send_Click(null, null);
                    RTB_Message.Focus();
                    RTB_Message.Clear();
                    e.Handled = true;
                }
            }版本2
      

  3.   

    TCP的操作..这个使用起来简单一些.
    http://blog.csdn.net/zgke/archive/2009/01/20/3838844.aspx
      

  4.   


    http://www.codeproject.com/KB/IP/Genesis.aspx
      

  5.   

    我是猎头公司的angel,目前有.net的相关需求,要求有5年以上的c#.net的相关经验,英文能进行英文面试,base:上海
    感兴趣的请联系我
    email:[email protected]
    msn: [email protected]