写了一个Udp信息收发静态类open in new window

最近准备利用.NET的套接字开发一个类似QQ的IM组件,先写了一个Udp信息收发静态类!也不是很完善,暂时先储备着,以后重构用!

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace XChatLib
{
    /// <summary>
    /// MessageUtility 消息工具类,该类是一个静态工具类。
    /// </summary>
    public class MessageUtility
    {
        //缺省端口号
        private const int DEFAULT_PORT = 9050;

        private MessageUtility()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        //发送消息方法
        public static void SendMessage(string msg)
        {
            byte[] data = new byte[1024];
            //本机主机信息
            IPHostEntry host = Dns.GetHostByName(Dns.GetHostName());

            //端口号参数以后重构时可以做成一个方法从配置文件中读取端口号
            IPEndPoint ipep = new IPEndPoint(host.AddressList[0], DEFAULT_PORT);

            //创建一个udp套接字
            Socket server = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);

            if(msg.Length != 0)
            {
                data = Encoding.Unicode.GetBytes(msg);
                try
                {
                    server.SendTo(data, data.Length, SocketFlags.None, ipep);
                }
                catch(SocketException){}
                finally
                {
                    server.Close();
                }
            }
        }

        //接受消息方法
        public static string ReceiveMessage()
        {
            int recv;
            byte[] data = new byte[1024];

            //创建一个随机终结点对象
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, DEFAULT_PORT);

            //创建一个Udp套接字
            Socket newsock = new Socket(
                AddressFamily.InterNetwork,SocketType.Dgram,    ProtocolType.Udp);

            //将随机终结点与Udp套接字绑定,以等待流入的数据包
            newsock.Bind(ipep);

            //创建一个接受任意发送者的终结点
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint tmpRemote = (EndPoint)(sender);

            try
            {
                recv = newsock.ReceiveFrom(data, ref tmpRemote);
                return Encoding.Unicode.GetString(data,0,data.Length);
            }
            catch(SocketException)
            {
                return null;
            }
            finally
            {
                newsock.Close();//关闭套接字释放资源
            }
        }
    }
}

posted on 2004-08-13 17:37 浪淘沙 阅读(111) 评论(4)


2004-08-13 17:47 | janssen

有些可以写在配置文件里面吧?
像端口号7712,补充一个轮询的组件找端口号,默认值7712,如果发现已占用就7712+1
在配置里面可以加上
DEFAULT_PORT=7712
DEFAULT_MAXLOOP=1000

2004-08-13 20:07 | xpilot

肯定是要写到配置文件中的。不过以后重构时在做了!

2004-08-14 11:24 | itspice

有没有测试用大量数据发送的时候,能不能接收到?

re: 写了一个Udp信息收发静态类!

目前还没有,后期会进行一些压力测试的!

Contributors: FHL